Compare commits

..

No commits in common. "main" and "v18.23.3-2.0" have entirely different histories.

1462 changed files with 87053 additions and 6781 deletions

View file

@ -1,101 +1,47 @@
name: Bug
description: Report a bug here
description: Make sure you complete the template. Otherwise, it will be closed without further explanation!
title: "[Bug] Replace this with your title"
labels: bug
body:
- type: checkboxes
attributes:
label: Is there an existing issue for this?
description: _Please search to see if an issue already exists for the bug you encountered_
options:
- label: I have searched the existing issues
required: true
- type: markdown
- type: checkboxes
attributes:
value: "## Device Info"
- type: input
attributes:
label: iOS/iPadOS version
placeholder: iOS 17.5.1
validations:
required: true
- type: input
attributes:
label: Device model
placeholder: iPhone 15 Pro Max
validations:
required: true
- type: input
attributes:
label: Sideload method
placeholder: AltStore, Sideloadly, TrollStore, Signulous, deb, ...
validations:
required: true
- type: input
attributes:
label: Tweak version
placeholder: YTLitePlus - v19.xx.x-4.0.1
description: "**latest or newest is NOT a version number!**"
validations:
required: true
- type: dropdown
attributes:
label: Do you use YouTube Premium?
label: Have you read the FAQ?
description: _Make sure you visit the [**FAQ**](https://github.com/qnblackcat/CercubePlus/wiki/FAQ) page first!_
options:
- ❌ No, I don't use YouTube Premium
- ✅ Yes, I do use YouTube Premium
- label: Yes, I read the FAQ
required: true
- type: textarea
attributes:
label: Device info
description:
value: |
- iOS/iPadOS version:
- Device model:
- Sideload tool (AltStore, Sideloadly, TrollStore,...):
- The specific version of CercubePlus (**latest** or **newest** is **NOT** a version number!):
validations:
required: true
- type: dropdown
attributes:
label: Are you using the newest version of YTLitePlus?
description: Update to the [latest version](https://github.com/YTLitePlus/YTLitePlus/releases) to see if it fixes your issue
options:
- ✅ Yes, I'm using the latest version
- ❌ No, I'll explain at the end
validations:
required: true
- type: dropdown
attributes:
label: Does the issue happen with the official YouTube from AppStore?
options:
- ❌ No, I can't reproduce this issue in the official YouTube from AppStore
- ✅ Yes, I can reproduce this issue in the official YouTube from AppStore
validations:
required: true
- type: dropdown
attributes:
label: Method used to build the iPA
options:
- buildapp.yml (GitHub Actions)
- build.sh (Shell script)
- Downloaded from third party
validations:
required: true
- type: markdown
attributes:
value: "## Description"
- type: textarea
attributes:
label: Describe the bug
description: Please attach videos or screenshots if possible
description: _Please attach videos or screenshots if possible_
validations:
required: true
- type: textarea
attributes:
label: Steps to reproduce the issue
description: Please attach videos or screenshots if possible
description: _Please attach videos or screenshots if possible_
value: |
1.
2.
@ -107,11 +53,34 @@ body:
id: logs
attributes:
label: Crash log (if the app crashes)
description: It can be found in Settings App > Privacy > Analytics & Improvements > Analytics Data > Youtube-xxx-xxx.ips
description: _If somehow the app crashes, **you must provide the crash log**. It can be found in your device's Settings App > Privacy > Analytics & Improvements > Analytics Data > Youtube-xxx-xxx.ips_
render: shell
- type: dropdown
attributes:
label: Are you using the newest version of CercubePlus? If not, why?
description: _Developers spend time and effort to fix bugs & add improvements with every release. Why don't you update to the [latest version](https://github.com/Balackburn/CercubePlusExtra/releases/latest) before reporting about an issue?_
multiple: false
options:
- ✅ Yes, I'm using the latest version of CercubePlus right now
- ❌ No, I'll explain at the end of the template
validations:
required: true
- type: dropdown
attributes:
label: Does the issue happen with the official YouTube from AppStore?
description: _Well, YouTube itself is buggy sometimes..._
multiple: false
options:
- ❌ No, It doesn't
- ✅ Yes, It does
validations:
required: true
- type: textarea
attributes:
label: Additional context
description: _Um, anything else you want to say?_
validations:
required: false

View file

@ -1,32 +0,0 @@
name: Feature Request
description: Request a new feature to be added
title: "[Request] Replace with your question"
labels: enhancement
body:
- type: checkboxes
attributes:
label: Is there an existing issue for this?
options:
- label: I have searched the existing issues
required: true
- type: dropdown
attributes:
label: Do you use YouTube Premium?
options:
- ❌ No, I don't use YouTube Premium
- ✅ Yes, I do use YouTube Premium
validations:
required: true
- type: textarea
attributes:
label: My feature request
validations:
required: true
- type: textarea
attributes:
label: Additional context
validations:
required: false

View file

@ -5,7 +5,8 @@ labels: question
body:
- type: checkboxes
attributes:
label: Is there an existing issue for this?
label: Is there an existing issue/question for this?
description: _Please search to see if an issue already exists for the bug you encountered. **I DON\'T MAKE THIS TICK BOX FOR COSMETIC.**_
options:
- label: I have searched the existing issues
required: true
@ -13,7 +14,7 @@ body:
- type: dropdown
attributes:
label: Do you think this is a bug?
description: _If so, please use the bug template_
description: _If you think this is a bug, please open a new issue with the bug template_
multiple: false
options:
- ✅ Yes, I believe this is a bug. I will open a new issue with the bug template
@ -24,11 +25,13 @@ body:
- type: textarea
attributes:
label: My question
description: _Please enter your question here_
validations:
required: true
- type: textarea
attributes:
label: Additional context
description: _Um, anything else you want to say?_
validations:
required: false

View file

@ -1,21 +1,42 @@
# ⚠️ Must Read ⚠️
- The .ipa file is no longer shared on Github due to a [Google DMCA notice](https://www.reddit.com/r/jailbreak/comments/1b86tiz/balackburn_here_maintainer_of_ytliteplus_ive_just/)
- You need to build it yourself. See [Wiki-Building](https://github.com/Balackburn/YTLitePlus/wiki/Building)
# [YOUR_TWEAK_NAME] Features
CercubePlus but adds Additional Features that shouldve been added to the native CercubePlus which were probably not added.
# YTLitePlus Release Information
**LowContrastMode:** This tweak helps remove the new contrasty looking UI that was first introducted way back in 2020 August/September. (Tweak made by arichorn)
<details>
<summary>More Features...</summary>
Current YouTube IPA: `%youtube_version%`
Current YTLite Version: `%ytliteplus_version%`
Current App Compatibility: `iOS/iPadOS 15.0` or later
**LowContrastModeColors:** for users who doesnt use gray will get a set of colors to switch which changes and improves the UI Customization. (Add-on added for LowContrastMode)
**RELEASE %youtube_version%-%ytliteplus_version%:** (%date%)
**YTNoHeatwaves:** Turns off the Heatwaves Feature in the video player. `(CercubePlus/VideoPlayerOverlayControls)`
- Updated Youtube from `%youtube_version%` to `%youtube_version%`
- Updated YTLite from `%ytliteplus_version%` to `%ytliteplus_version%`
### Issues in this Release:
- LowContrastMode does not work *(Compatible only with YouTube v17.33.2-v17.38.10)*
- Hiding Shorts creates an empty space instead #55
**YTNoUpgradeDialog:** Disables the Upgrade Dialog so you wont be prompt to update the app.
### Catbox
`%catbox_url%`
**YouMute:** Mute/unmute videos in YouTube directly.
**iPadLayout:** Gives iPhone users the ability to use the iPads Interface and the ability to use the some of the YouTube features that are not on iPhone.
**iPhoneLayout:** Gives iPad users the ability to use Community Posts, to create Shorts and the ability to use the buggy iPhone layout. but using it in split view mode fixes the ui.
**HideSponsorBlockButton:** Hide the SponsorBlock Button shown on the Nav Bar. Added by Dayanch96
**DisableWifiRelatedOptions:** want to remove sections that are only shown when internet is on? You can toggle this to remove all of those sections. Well not all but toggling the option will remove some of the annoying sections that may not be used.
**HideShadowOverlayButtons:** want to remove shadow overlay on the buttons used in the video player? Then toggle this to remove the Shadow Overlay on the buttons Previous, Next, Rewind, Forward.
**etc..**
</details>
# [YOUR_TWEAK_NAME] Release Information
Current YouTube IPA: `TEMPLATE`
Current Cercube Version: `v5.3.13`
Current App Compatibility: `iOS/iPadOS 14.0` or later
**RELEASE F1:**
[THIS IS WHERE YOU PUT YOUR CHANGES BELOW, also F1 indicates First Release on the same YouTube Version in case you needed to know]
- [<-- this subtract symbol makes the changelog look cool]
- [this right here shows you added additonal changes on a certain tweak like this for example, below]
- Improvements
- Fixed Sign-in Issue
- Fixed Ads Not Working Issue
[THIS IS HOW YOU DO IT! YOU CAN DELETE ALL OF THE TEXT I'VE SAID!]

View file

@ -6,44 +6,34 @@ name: Build and Release YTLitePlus
on:
workflow_dispatch:
inputs:
sdk_version:
description: "iOS SDK Version"
default: "16.5"
required: true
type: string
decrypted_youtube_url:
description: "Direct URL of the decrypted YouTube ipa"
description: "The direct URL to the decrypted YouTube ipa"
default: ""
required: true
type: string
youtube_version:
description: "The version of YouTube"
default: ""
required: true
type: string
ytliteplus_version:
description: "The version of YTLitePlus"
default: "2.0"
required: true
type: string
bundle_id:
description: "Modify the bundle ID"
description: "Modify the bundle ID. Not recommended"
default: "com.google.ios.youtube"
required: true
type: string
app_name:
description: "Modify the app name"
description: "Modify the name of the app on the Home Screen. Not recommended"
default: "YouTube"
required: true
type: string
commit_id:
description: "(Optional) Commit ID to build at"
default: ""
required: false
type: string
upload_artifact:
description: "Upload iPA as artifact (Public)"
default: true
required: false
type: boolean
catbox_upload:
description: "Upload iPA to Catbox.moe (URL)"
default: false
required: false
type: boolean
create_release:
description: "Create a draft release (Private)"
default: false
description: "Create a draft release"
default: true
required: false
type: boolean
@ -54,53 +44,47 @@ concurrency:
jobs:
build:
name: Build YTLitePlus
runs-on: macos-12
runs-on: macos-latest
permissions:
contents: write
steps:
- name: Checkout Main
uses: actions/checkout@v4
uses: actions/checkout@v3.5.2
with:
path: main
ref: ${{ github.event.inputs.commit_id || github.ref }}
submodules: recursive
- name: Install Dependencies
run: brew install ldid dpkg make
- name: Download Theos
uses: actions/checkout@v4
- name: Setup Theos
uses: actions/checkout@v3.5.2
with:
repository: theos/theos
ref: 3da31488281ecf4394d10302d2629607f4a1aa07
ref: master
path: theos
submodules: recursive
- name: iOS SDK Caching
- name: Caching
id: SDK
uses: actions/cache@v4
uses: actions/cache@v3.3.1
env:
cache-name: iOS-${{ inputs.sdk_version }}-SDK
cache-name: iOS-15.5-SDK
with:
path: theos/sdks/
key: ${{ env.cache-name }}
restore-keys: ${{ env.cache-name }}
- name: Download iOS SDK
- name: Download iOS 15.5 SDK
if: steps.SDK.outputs.cache-hit != 'true'
run: |
# Only download the specific SDK version
git clone -n --depth=1 --filter=tree:0 https://github.com/theos/sdks/
cd sdks
git sparse-checkout set --no-cone iPhoneOS${{ inputs.sdk_version }}.sdk
git checkout
svn checkout -q https://github.com/chrisharper22/sdks/trunk/iPhoneOS15.5.sdk
mv *.sdk $THEOS/sdks
env:
THEOS: ${{ github.workspace }}/theos
- name: Download Theos Jailed
uses: actions/checkout@v4.1.7
- name: Setup Theos Jailed
uses: actions/checkout@v3.5.2
with:
repository: qnblackcat/theos-jailed
ref: master
@ -112,146 +96,64 @@ jobs:
./theos-jailed/install
env:
THEOS: ${{ github.workspace }}/theos
- name: Fix Compiling
run: |
# Update GNU Make to allow for faster building
echo "$(brew --prefix make)/libexec/gnubin" >> $GITHUB_PATH
(echo export PATH="/usr/local/opt/make/libexec/gnubin:$PATH" >> ~/.bash_profile)
source ~/.bash_profile
- name: Prepare YouTube iPA
run: |
# Download and unzip iPA
wget "$YOUTUBE_URL" --no-verbose -O main/YouTube.ipa
echo -e "==> \033[1mYouTube v${{ inputs.youtube_version }} downloaded! \033[0m"
unzip -q main/YouTube.ipa -d main/tmp
# Get the version number of the YouTube app and store it
echo "YT_VERSION=$(grep -A 1 '<key>CFBundleVersion</key>' main/tmp/Payload/YouTube.app/Info.plist | grep '<string>' | awk -F'[><]' '{print $3}')" >> $GITHUB_ENV
# Get the version number of the latest release
wget -qO- https://github.com/dayanch96/YTLite/releases/latest > main/tmp/release_page.html
YTLITE_VERSION=$(grep -o -E '/tag/v[^"]+' main/tmp/release_page.html | head -n 1 | sed 's/\/tag\/v//')
echo "YTLITE_VERSION=${YTLITE_VERSION}" >> $GITHUB_ENV
echo $YTLITE_VERSION
# Remove contents in the iPA that interfere with sideloading
rm -rf main/tmp/Payload/YouTube.app/_CodeSignature/CodeResources
rm -rf main/tmp/Payload/YouTube.app/PlugIns/*
# Modify Info.plist to remove UISupportedDevices (Python script)
python - <<EOF
import plistlib
def remove_uisupporteddevices(filepath):
with open(filepath, 'rb') as f:
plist = plistlib.load(f)
if 'UISupportedDevices' in plist:
del plist['UISupportedDevices']
with open(filepath, 'wb') as f:
plistlib.dump(plist, f)
filepath = 'main/tmp/Payload/YouTube.app/Info.plist'
remove_uisupporteddevices(filepath)
EOF
# Manually install the Open in YouTube extension
cp -R main/Extensions/*.appex main/tmp/Payload/YouTube.app/PlugIns
echo -e "==> \033[1mYouTube v${{ inputs.youtube_version }} unpacked! \033[0m"
env:
THEOS: ${{ github.workspace }}/theos
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
YOUTUBE_URL: ${{ inputs.decrypted_youtube_url }}
- name: Build Package
- name: Fix Compiling & Build Package
id: build_package
run: |
(echo PATH=\"$(brew --prefix make)/libexec/gnubin:\$PATH\" >> ~/.zprofile)
cd ${{ github.workspace }}/main
# Replace lines in Makefile based on inputs
sed -i '' "s/^BUNDLE_ID.*$/BUNDLE_ID = ${{ env.BUNDLE_ID }}/" Makefile
sed -i '' "s/^DISPLAY_NAME.*$/DISPLAY_NAME = ${{ env.APP_NAME }}/" Makefile
sed -i '' "s/^PACKAGE_VERSION.*$/PACKAGE_VERSION = ${{ env.YT_VERSION }}-${{ env.YTLITE_VERSION }}/" Makefile
sed -i '' "s/^export TARGET.*$/export TARGET = iphone:clang:${{ inputs.sdk_version }}:14.0/" Makefile
# Build the package
make package
# Rename the package based on the version
(mv "packages/$(ls -t packages | head -n1)" "packages/YTLitePlus_${{ env.YT_VERSION }}_${{ env.YTLITE_VERSION }}.ipa")
# Pass package name to the upload step
echo "package=$(ls -t packages | head -n1)" >> $GITHUB_OUTPUT
# Print out the hash and bundle ID
sed -i '' "12s#.*#BUNDLE_ID = ${{ env.BUNDLE_ID }}#g" Makefile
sed -i '' "11s#.*#DISPLAY_NAME = ${{ env.APP_NAME }}#g" Makefile
make package FINALPACKAGE=1
(mv "packages/$(ls -t packages | head -n1)" "packages/YTLitePlus_${{ env.YOUTUBE_VERSION }}.ipa")
echo "package=$(ls -t packages | head -n1)" >>$GITHUB_OUTPUT
echo -e "==> \033[1mSHASUM256: $(shasum -a 256 packages/*.ipa | cut -f1 -d' ')\033[0m"
echo -e "==> \033[1mBundle ID: ${{ env.BUNDLE_ID }}\033[0m"
env:
THEOS: ${{ github.workspace }}/theos
ytliteplus_version: ${{ inputs.ytliteplus_version }}
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
BUNDLE_ID: ${{ inputs.bundle_id }}
APP_NAME: ${{ inputs.app_name }}
- name: Upload Artifact
if: ${{ inputs.upload_artifact }}
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v3.1.2
env:
ytliteplus_version: ${{ inputs.ytliteplus_version }}
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
with:
name: YTLitePlus_${{ env.YT_VERSION }}_${{ env.YTLITE_VERSION }}
name: YTLitePlus_${{ env.YOUTUBE_VERSION }}_${{ env.ytliteplus_version }}
path: ${{ github.workspace }}/main/packages/${{ steps.build_package.outputs.package }}
if-no-files-found: error
- name: Upload Artifact to Catbox
if: ${{ inputs.catbox_upload }}
run: |
RESPONSE=$(curl -F "reqtype=fileupload" -F "fileToUpload=@${{ github.workspace }}/main/packages/${{ steps.build_package.outputs.package }}" https://catbox.moe/user/api.php)
CATBOX_URL=$(echo $RESPONSE | grep -o -E 'https://files.catbox.moe/[^"]*')
echo "Uploaded artifact to $CATBOX_URL"
CATBOX_FILE=$(echo $CATBOX_URL | sed 's|https://files.catbox.moe/||')
# Pass Catbox URL to the release steps
echo "CATBOX_FILE=$CATBOX_FILE" >> $GITHUB_ENV
echo "CATBOX_URL=$CATBOX_URL" >> $GITHUB_ENV
- name: Prepare Release Notes
if: ${{ inputs.create_release }}
run: |
export TODAY=$(date '+%Y-%m-%d')
sed "s/%ytliteplus_version%/${{ env.YTLITE_VERSION }}/g; s/%youtube_version%/${{ env.YT_VERSION }}/g; s/%catbox_url%/${{ env.CATBOX_FILE }}/g; s/%date%/$TODAY/g" \
main/.github/RELEASE_TEMPLATE/Release.md > ${{ github.workspace }}/release_notes.md
- name: Create Draft Release
if: ${{ inputs.create_release }}
- name: Create Release
id: create_release
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@v0.1.15
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ytliteplus_version: ${{ inputs.ytliteplus_version }}
YOUTUBE_VERSION: ${{ inputs.youtube_version }}
DRAFT: ${{ inputs.create_release }}
with:
tag_name: v${{ env.YT_VERSION }}-${{ env.YTLITE_VERSION }}
name: v${{ env.YT_VERSION }}-${{ env.YTLITE_VERSION }} - YTLitePlus
tag_name: v${{ env.YOUTUBE_VERSION }}-${{ env.ytliteplus_version }}-(${{ github.run_number }})
name: v${{ env.YOUTUBE_VERSION }}-${{ env.ytliteplus_version }}-(${{ github.run_number }})
files: main/packages/*.ipa
draft: true
body_path: ${{ github.workspace }}/release_notes.md
draft: ${{ env.DRAFT }}
- name: Update Altstore Source with latest release
if: ${{ inputs.create_release }}
run: |
curl --location --request POST 'https://api.github.com/repos/Balackburn/YTLitePlusAltstore/dispatches' \
--header 'Authorization: token ${{ secrets.PERSONAL_ACCESS_TOKEN }}' \
--header 'Content-Type: application/json' \
--data-raw '{
"event_type": "update-altstore-source-trigger"
}'
- name: Job Summary
run: |
echo -e '### 📺 Build Complete' >> $GITHUB_STEP_SUMMARY
- name: Job Summary - Artifact Upload
if: ${{ inputs.upload_artifact }}
run: |
echo -e '### 📦 Artifact Upload\n\nThe artifact was uploaded successfully! Refresh and [scroll down](#artifacts) to view the artifact. Note that you must be signed in to GitHub to download it.' >> $GITHUB_STEP_SUMMARY
- name: Job Summary - Catbox Upload
if: ${{ inputs.catbox_upload}}
run: |
echo -e '### 🐱 Catbox Upload\n\nThe Catbox upload was successful! Here is a permanent shareable link: '$CATBOX_URL >> $GITHUB_STEP_SUMMARY
- name: Job Summary - Draft Release
if: ${{ inputs.create_release }}
run: |
REPO_URL="https://github.com/${{ github.repository }}"
RELEASES_URL="$REPO_URL/releases"
echo -e '### 🚀 Draft Release\n\nThe release draft has been created successfully! You can view your releases here: '$RELEASES_URL >> $GITHUB_STEP_SUMMARY
- name: Job Summary - Link to remove GitHub Action runs
run: |
REPO_URL="https://github.com/${{ github.repository }}"
DELETE_RUNS_URL="$REPO_URL/actions/workflows/delete-workflow-runs.yml"
echo -e '### 🧹 Cleanup\n\nYou can remove previous GitHub Action runs here: '$DELETE_RUNS_URL >> $GITHUB_STEP_SUMMARY

View file

@ -1,69 +0,0 @@
# This is based on the example at https://github.com/marketplace/actions/delete-workflow-runs
name: Delete old workflow runs
on:
workflow_dispatch:
inputs:
days:
description: 'Days-worth of runs to keep for each workflow'
required: true
default: '0'
minimum_runs:
description: 'Minimum runs to keep for each workflow'
required: true
default: '0'
delete_workflow_pattern:
description: 'Name or filename of the workflow (if not set, all workflows are targeted)'
required: false
default: 'Build and Release YTLitePlus'
delete_workflow_by_state_pattern:
description: 'Filter workflows by state: active, deleted, disabled_fork, disabled_inactivity, disabled_manually'
required: true
default: "ALL"
type: choice
options:
- "ALL"
- active
- deleted
- disabled_inactivity
- disabled_manually
delete_run_by_conclusion_pattern:
description: 'Remove runs based on conclusion: action_required, cancelled, failure, skipped, success'
required: true
default: "ALL"
type: choice
options:
- "ALL"
- "Unsuccessful: action_required,cancelled,failure,skipped"
- action_required
- cancelled
- failure
- skipped
- success
dry_run:
description: 'Logs simulated changes, no deletions are performed'
required: false
jobs:
del_runs:
runs-on: ubuntu-latest
permissions:
actions: write
contents: read
steps:
- name: Delete workflow runs
uses: Mattraks/delete-workflow-runs@v2
with:
token: ${{ github.token }}
repository: ${{ github.repository }}
retain_days: ${{ github.event.inputs.days }}
keep_minimum_runs: ${{ github.event.inputs.minimum_runs }}
delete_workflow_pattern: ${{ github.event.inputs.delete_workflow_pattern }}
delete_workflow_by_state_pattern: ${{ github.event.inputs.delete_workflow_by_state_pattern }}
delete_run_by_conclusion_pattern: >-
${{
startsWith(github.event.inputs.delete_run_by_conclusion_pattern, 'Unsuccessful:')
&& 'action_required,cancelled,failure,skipped'
|| github.event.inputs.delete_run_by_conclusion_pattern
}}
dry_run: ${{ github.event.inputs.dry_run }}

View file

@ -1,35 +0,0 @@
name: Update Submodules
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * *'
jobs:
update-submodules:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4.1.7
- name: Set up Git
run: |
git config --global user.email "actions@github.com"
git config --global user.name "GitHub Actions"
- name: Update submodules
run: |
git submodule update --init --recursive --remote
git add .
git commit -m "updated submodules"
git push origin
continue-on-error: true
- name: Check exit code
run: |
exit_code=$?
if [ $exit_code -ne 0 ]; then
echo "Submodule update failed with exit code $exit_code"
exit 1
fi

6
.gitignore vendored
View file

@ -2,6 +2,6 @@
.theos/
packages/
tmp/
Tweaks/YTLite/*
!Tweaks/YTLite/.gitkeep
Resources/
Tweaks/Cercube/*
!Tweaks/Cercube/.gitkeep
Resources/

77
.gitmodules vendored
View file

@ -1,60 +1,45 @@
[submodule "Tweaks/YTUHD"]
path = Tweaks/YTUHD
url = https://github.com/PoomSmart/YTUHD.git
[submodule "Tweaks/YouPiP"]
path = Tweaks/YouPiP
url = https://github.com/PoomSmart/YouPiP.git
[submodule "Tweaks/Return-YouTube-Dislikes"]
path = Tweaks/Return-YouTube-Dislikes
url = https://github.com/PoomSmart/Return-YouTube-Dislikes.git
[submodule "Tweaks/YouTubeHeader"]
path = Tweaks/YouTubeHeader
url = https://github.com/PoomSmart/YouTubeHeader.git
[submodule "Tweaks/Alderis"]
path = Tweaks/Alderis
url = https://github.com/hbang/Alderis.git
url = https://github.com/qnblackcat/Alderis.git
[submodule "Tweaks/PSHeader"]
path = Tweaks/PSHeader
url = https://github.com/PoomSmart/PSHeader.git
[submodule "Tweaks/YTABConfig"]
path = Tweaks/YTABConfig
url = https://github.com/PoomSmart/YTABConfig.git
[submodule "Tweaks/YouMute"]
path = Tweaks/YouMute
url = https://github.com/PoomSmart/YouMute.git
[submodule "Tweaks/RemoteLog"]
path = Tweaks/RemoteLog
url = https://github.com/Muirey03/RemoteLog.git
[submodule "Tweaks/FLEX"]
path = Tweaks/FLEX
url = https://github.com/qnblackcat/FLEX-Classes.git
[submodule "Tweaks/iSponsorBlock"]
path = Tweaks/iSponsorBlock
url = https://github.com/Galactic-Dev/iSponsorBlock.git
[submodule "Tweaks/YTHoldForSpeed"]
path = Tweaks/YTHoldForSpeed
url = https://github.com/arichornloverALT/YTHoldForSpeed.git
[submodule "Tweaks/DontEatMyContent"]
path = Tweaks/DontEatMyContent
url = https://github.com/therealFoxster/DontEatMyContent.git
[submodule "Extensions"]
path = Extensions
url = https://github.com/CokePokes/YoutubeExtensions.git
[submodule "Tweaks/YTVideoOverlay"]
path = Tweaks/YTVideoOverlay
url = https://github.com/arichornloverALT/YTVideoOverlay.git
[submodule "Tweaks/protobuf"]
path = Tweaks/protobuf
url = https://github.com/protocolbuffers/protobuf.git
[submodule "Tweaks/YouTubeHeader"]
path = Tweaks/YouTubeHeader
url = https://github.com/PoomSmart/YouTubeHeader.git
[submodule "Tweaks/YouPiP"]
path = Tweaks/YouPiP
url = https://github.com/PoomSmart/YouPiP
[submodule "Tweaks/YTABConfig"]
path = Tweaks/YTABConfig
url = https://github.com/PoomSmart/YTABConfig
[submodule "Tweaks/YTUHD"]
path = Tweaks/YTUHD
url = https://github.com/PoomSmart/YTUHD
[submodule "Tweaks/YouGroupSettings"]
path = Tweaks/YouGroupSettings
url = https://github.com/PoomSmart/YouGroupSettings
[submodule "Tweaks/YouMute"]
path = Tweaks/YouMute
url = https://github.com/PoomSmart/YouMute
[submodule "Tweaks/YouQuality"]
path = Tweaks/YouQuality
url = https://github.com/PoomSmart/YouQuality
[submodule "Tweaks/Return-YouTube-Dislikes"]
path = Tweaks/Return-YouTube-Dislikes
url = https://github.com/arichornloverALT/Return-YouTube-Dislikes.git
[submodule "Tweaks/YTHeaders"]
path = Tweaks/YTHeaders
url = https://github.com/therealFoxster/YTHeaders
[submodule "Tweaks/YouTimeStamp"]
path = Tweaks/YouTimeStamp
url = https://github.com/arichornloverALT/YouTimeStamp.git
[submodule "Tweaks/YouLoop"]
path = Tweaks/YouLoop
url = https://github.com/bhackel/YouLoop
[submodule "Tweaks/YTHoldForSpeed"]
path = Tweaks/YTHoldForSpeed
url = https://github.com/arichorn/YTHoldForSpeed.git
[submodule "Tweaks/DontEatMyContent"]
path = Tweaks/DontEatMyContent
url = https://github.com/therealFoxster/DontEatMyContent.git
[submodule "Tweaks/YTLite"]
path = Tweaks/YTLite
url = https://github.com/dayanch96/YTLite.git

@ -1 +0,0 @@
Subproject commit a68d70883d297fcc6669429dfd1439848e96e411

2
Extensions/.gitattributes vendored Normal file
View file

@ -0,0 +1,2 @@
# Auto detect text files and perform LF normalization
* text=auto

1
Extensions/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
.DS_Store

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,333 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Info.plist</key>
<data>
5KaPBsMVTGZfcc05Od8nGW6/EyQ=
</data>
<key>_locales/en/messages.json</key>
<data>
8cPkszxzYFSjhRWsf34A0AiHaPM=
</data>
<key>background.js</key>
<data>
tClFxbnUm0L65Qj+Qu8Fk9asL2o=
</data>
<key>content.js</key>
<data>
a6o4B4PMlrIOBXlniU2NS4D9SJE=
</data>
<key>embedded.mobileprovision</key>
<data>
dVGLS8Qpu/eCI1J5VCu9IfYq3Z4=
</data>
<key>images/cat_1.0.gif</key>
<data>
DtSTnvB7wRt647kM1b38KLfDfXA=
</data>
<key>images/icon-128.png</key>
<data>
rYa1lv1LgkO3fkP9h6gRSjlQgqk=
</data>
<key>images/icon-256.png</key>
<data>
05xbekvTg28KsH9RRIKQRL8tqQs=
</data>
<key>images/icon-48.png</key>
<data>
BWUZe8raKzOzA2cDWIYFoBPxxw8=
</data>
<key>images/icon-512.png</key>
<data>
shzpVHJMsAu4q820Fb+YzByiFhc=
</data>
<key>images/icon-64.png</key>
<data>
HZC4YIb4ZLg4lpjNAKFqSaka6r0=
</data>
<key>images/icon-96.png</key>
<data>
IPAOd1HfCtCI7ybhVhwA5TU/BZ8=
</data>
<key>images/toolbar-icon-16.png</key>
<data>
Bkb2Cy8VYIcWl7wFZ2HcWZcCoyA=
</data>
<key>images/toolbar-icon-19.png</key>
<data>
XLkdODJ73CVbwn/1LCAsfB6scPg=
</data>
<key>images/toolbar-icon-32.png</key>
<data>
0cQgf/z3urGdzsmtmc2Wnim1+lg=
</data>
<key>images/toolbar-icon-38.png</key>
<data>
eas7Tl3/r2JMZf6nK84ZjoBJrZo=
</data>
<key>images/toolbar-icon-48.png</key>
<data>
fxyz1xgkIR877Cf/7uYNUqXrxoM=
</data>
<key>images/toolbar-icon-72.png</key>
<data>
pHL3CJwjPY30T9sFvvcA2qlraBw=
</data>
<key>manifest.json</key>
<data>
b37QyqMYHlvlfOjbvJLOKeAM5Y4=
</data>
<key>popup.css</key>
<data>
mXR2qQxu+ceMOItNpc4aImux5wY=
</data>
<key>popup.html</key>
<data>
zTk6QImmvcZjMYLQY8ek+cqSEWg=
</data>
<key>popup.js</key>
<data>
grmSQBg1aRbGzHHjd3TWHS/HbOY=
</data>
</dict>
<key>files2</key>
<dict>
<key>_locales/en/messages.json</key>
<dict>
<key>hash2</key>
<data>
4pOaVgBrOGGIoI81XdEOZidIyW9peYtz85HIYX7d1QE=
</data>
</dict>
<key>background.js</key>
<dict>
<key>hash2</key>
<data>
2S7ONYvdkGsryEavyrR7nMCTwsjNGqMV2BSWIxWLSYg=
</data>
</dict>
<key>content.js</key>
<dict>
<key>hash2</key>
<data>
9CYz6yZ8bRI2JRzRwnn4DOGuPuy2GSsOudXSZU6s1po=
</data>
</dict>
<key>embedded.mobileprovision</key>
<dict>
<key>hash2</key>
<data>
4TQyzTTz0VYUTM0IXf2PMSufVEkzd4WlPWbwKMyfKfQ=
</data>
</dict>
<key>images/cat_1.0.gif</key>
<dict>
<key>hash2</key>
<data>
65Ql3FhfivRMoMifbuY5KK8I/1rZx/Zmmwsx1La4OyI=
</data>
</dict>
<key>images/icon-128.png</key>
<dict>
<key>hash2</key>
<data>
TV8I8bcVP9rAnVA4AJRAWtkJveIenMpYsd/7+rsMLzo=
</data>
</dict>
<key>images/icon-256.png</key>
<dict>
<key>hash2</key>
<data>
kksdsW0Y1svz0bT0i3UzQGBmBDxJGr2eTCZmaqTS+XM=
</data>
</dict>
<key>images/icon-48.png</key>
<dict>
<key>hash2</key>
<data>
mBNPpZ78p0eH4WsNdF/EXw/sFHq5f8PqERARlLulYbY=
</data>
</dict>
<key>images/icon-512.png</key>
<dict>
<key>hash2</key>
<data>
waQn18oFc3GbhXXm2HEn6xFQk3HKehp9crGljWAMsGQ=
</data>
</dict>
<key>images/icon-64.png</key>
<dict>
<key>hash2</key>
<data>
CJwxajQk49Cd0RfR22yEPO6pjDbg+Aa4Ocxi+812CiM=
</data>
</dict>
<key>images/icon-96.png</key>
<dict>
<key>hash2</key>
<data>
zuzRjCepizxOWXh9ftCPth38GUxy1Ea/4zS3dw19OXo=
</data>
</dict>
<key>images/toolbar-icon-16.png</key>
<dict>
<key>hash2</key>
<data>
xmXH4YHb+Pq/YuC1e8JLIun93LuM3+/8MvB3r8oTKls=
</data>
</dict>
<key>images/toolbar-icon-19.png</key>
<dict>
<key>hash2</key>
<data>
qSX/1Ux4BOUIhixJK5NkvyTomLwp0yISfsQ97uF8/5g=
</data>
</dict>
<key>images/toolbar-icon-32.png</key>
<dict>
<key>hash2</key>
<data>
pGDg4NcSdD5EQaZgaiwxNosbSEXmZnpRc79RfitKc1c=
</data>
</dict>
<key>images/toolbar-icon-38.png</key>
<dict>
<key>hash2</key>
<data>
BUU3dwrCSvNOiFkBQWdPkrwASjUvxSxbizW+Izt3LBA=
</data>
</dict>
<key>images/toolbar-icon-48.png</key>
<dict>
<key>hash2</key>
<data>
JLZV5da+fZkfw0m2KfMqHSixWBCJvZoUNlt3la7gm54=
</data>
</dict>
<key>images/toolbar-icon-72.png</key>
<dict>
<key>hash2</key>
<data>
TwM7A1Bkuv4C3SWorFNwG+w38mWo3TaMtglLdDXxcFw=
</data>
</dict>
<key>manifest.json</key>
<dict>
<key>hash2</key>
<data>
+nWdvS9ap7YzpjqKSWsGUHP5K2irkTGozQX/tI4WrYc=
</data>
</dict>
<key>popup.css</key>
<dict>
<key>hash2</key>
<data>
LIfF3an8mzKIMD8PDhKILnrZBhxxSTzoZQKyRiyWuB0=
</data>
</dict>
<key>popup.html</key>
<dict>
<key>hash2</key>
<data>
9Ro1fCC5Meq0eSNrYab7V3uc4tNvmwRqMsCb1757M6Q=
</data>
</dict>
<key>popup.js</key>
<dict>
<key>hash2</key>
<data>
ruLXAORE+vDoLKPGBSkl7hnXv8V+ZexCoX3KvJyHxBk=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,10 @@
{
"extension_name": {
"message": "OpenYoutube",
"description": "The display name for the extension."
},
"extension_description": {
"message": "Displays an Open in Youtube alert for sideloaded YT",
"description": "Description of what the extension does."
}
}

View file

@ -0,0 +1,6 @@
browser.runtime.onMessage.addListener((request, sender, sendResponse) => {
console.log("Received request: ", request);
if (request.greeting === "hello")
sendResponse({ farewell: "goodbye" });
});

View file

@ -0,0 +1,25 @@
browser.runtime.sendMessage({ greeting: "hello" }).then((response) => {
console.log("Received response: ", response);
});
browser.runtime.onMessage.addListener((request, sender, sendResponse) => {
console.log("Received request: ", request);
});
function afterNavigate() {
if ('/watch' === location.pathname) {
window.location.href = `youtube://${window.location.pathname.slice(1)}${
window.location.search
}${window.location.hash}`;
}
}
(document.body || document.documentElement).addEventListener('transitionend',
function(/*TransitionEvent*/ event) {
if (event.propertyName === 'width' && event.target.id === 'progress') {
afterNavigate();
}
}, true);
// After page load
afterNavigate();

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 569 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 919 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -0,0 +1,40 @@
{
"manifest_version": 2,
"default_locale": "en",
"name": "__MSG_extension_name__",
"description": "__MSG_extension_description__",
"version": "1.0",
"icons": {
"48": "images/icon-48.png",
"96": "images/icon-96.png",
"128": "images/icon-128.png",
"256": "images/icon-256.png",
"512": "images/icon-512.png"
},
"background": {
"scripts": [ "background.js" ],
"persistent": false
},
"content_scripts": [{
"js": [ "content.js" ],
"matches": [ "*://*.youtube.com/*" ]
}],
"browser_action": {
"default_popup": "popup.html",
"default_icon": {
"16": "images/toolbar-icon-16.png",
"19": "images/toolbar-icon-19.png",
"32": "images/toolbar-icon-32.png",
"38": "images/toolbar-icon-38.png",
"48": "images/toolbar-icon-48.png",
"72": "images/toolbar-icon-72.png"
}
},
"permissions": [ ]
}

View file

@ -0,0 +1,15 @@
:root {
color-scheme: light dark;
}
body {
width: 100px;
padding: 10px;
font-family: system-ui;
text-align: center;
}
@media (prefers-color-scheme: dark) {
/* Dark Mode styles go here. */
}

View file

@ -0,0 +1,21 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="popup.css">
<script type="module" src="popup.js"></script>
</head>
<style>
body {
background-image:url('images/cat_1.0.gif');
background-size:100%;
background-repeat: repeat-y;
background-attachment: fixed;
height:100%;
width:100%;
}
</style>
<body>
<strong>Extension made by @CokePokes</strong>
</body>
</html>

View file

@ -0,0 +1 @@
console.log("Hello World!", browser);

20
Extensions/README.md Normal file
View file

@ -0,0 +1,20 @@
# YoutubeExtensions
appex extensions for sideloaded YT
What is this?
These plugins enable "Open In" for sideloaded Youtube without any need to download other Opener apps /Shortcuts.
How to install:
1. Download the .appex files here
2. Unzip Youtube.ipa & copy them to /Payload/Youtube.app/Plugins
3. Compress Payload folder & rename .zip to .ipa
4. Sign & Install onto device
5. Open YouTube once & then open Safari to enable the iOS 15 safari plugin [prompted always allow - do it]
6. Press the Share icon in Safari scroll app list > More > Enable Youtube
Done!

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1,157 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Base.lproj/MainInterface.storyboardc/Info.plist</key>
<data>
Bgt43YuQd48Y7NBkKAH/I1Nd+7Q=
</data>
<key>Base.lproj/MainInterface.storyboardc/UIViewController-j1y-V4-xli.nib</key>
<data>
t/rVTMy59WLCl0e0ydlT2JlJKIs=
</data>
<key>Base.lproj/MainInterface.storyboardc/j1y-V4-xli-view-wbc-yd-nQP.nib</key>
<data>
56s4vIzFNrq5HEvB3Mr6qnqVRFg=
</data>
<key>Info.plist</key>
<data>
7+n2S5sS/Ngeoe21gJMc6iC6+ac=
</data>
<key>embedded.mobileprovision</key>
<data>
dVGLS8Qpu/eCI1J5VCu9IfYq3Z4=
</data>
<key>icon.png</key>
<data>
/pip+c1EETgjhxNcOhgiyQxxzyU=
</data>
</dict>
<key>files2</key>
<dict>
<key>Base.lproj/MainInterface.storyboardc/Info.plist</key>
<dict>
<key>hash2</key>
<data>
Qnp5pVqL/lRCSEISDYZs1VBLxfcEnfpOzHg6WgcgLgk=
</data>
</dict>
<key>Base.lproj/MainInterface.storyboardc/UIViewController-j1y-V4-xli.nib</key>
<dict>
<key>hash2</key>
<data>
VpQww1vK2BoM0RIaiw/B/8JZ3kp5Pks5bM8Sjtjju9w=
</data>
</dict>
<key>Base.lproj/MainInterface.storyboardc/j1y-V4-xli-view-wbc-yd-nQP.nib</key>
<dict>
<key>hash2</key>
<data>
C87FO0vFlvhG8vp7+3v+EcR9kbOeu9v+mDLy/iU+6e8=
</data>
</dict>
<key>embedded.mobileprovision</key>
<dict>
<key>hash2</key>
<data>
4TQyzTTz0VYUTM0IXf2PMSufVEkzd4WlPWbwKMyfKfQ=
</data>
</dict>
<key>icon.png</key>
<dict>
<key>hash2</key>
<data>
mfufJ0CJyFLUpRnLC8q8awHkGqmWeQtRDgF5EBXKUQs=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,7 @@
var GetURL = function() {};
GetURL.prototype = {
run: function(arguments) {
arguments.completionFunction({"URL": document.URL});
}
};
var ExtensionPreprocessingJS = new GetURL;

165
Header.h Normal file
View file

@ -0,0 +1,165 @@
#import "Tweaks/YouTubeHeader/YTPlayerViewController.h" // Header.h
#import "Tweaks/YouTubeHeader/YTQTMButton.h" // Header.h
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <CaptainHook/CaptainHook.h>
#import <objc/runtime.h>
#import <dlfcn.h>
#import <sys/utsname.h>
#import <substrate.h>
#import <rootless.h>
#import "Tweaks/FLEX/FLEX.h"
#import "Tweaks/YouTubeHeader/YTVideoQualitySwitchOriginalController.h"
#import "Tweaks/YouTubeHeader/YTPlayerViewController.h"
#import "Tweaks/YouTubeHeader/YTWatchController.h"
#import "Tweaks/YouTubeHeader/YTIGuideResponse.h"
#import "Tweaks/YouTubeHeader/YTIGuideResponseSupportedRenderers.h"
#import "Tweaks/YouTubeHeader/YTIPivotBarSupportedRenderers.h"
#import "Tweaks/YouTubeHeader/YTIPivotBarRenderer.h"
#import "Tweaks/YouTubeHeader/YTIBrowseRequest.h"
#import "Tweaks/YouTubeHeader/YTCommonColorPalette.h"
#import "Tweaks/YouTubeHeader/ASCollectionView.h"
#import "Tweaks/YouTubeHeader/YTPlayerOverlay.h"
#import "Tweaks/YouTubeHeader/YTPlayerOverlayProvider.h"
#import "Tweaks/YouTubeHeader/YTReelWatchPlaybackOverlayView.h"
#import "Tweaks/YouTubeHeader/YTReelPlayerBottomButton.h"
#import "Tweaks/YouTubeHeader/YTReelPlayerViewController.h"
#import "Tweaks/YouTubeHeader/YTAlertView.h"
#import "Tweaks/YouTubeHeader/YTISectionListRenderer.h"
#import "Tweaks/YouTubeHeader/YTPivotBarItemView.h"
#define LOC(x) [tweakBundle localizedStringForKey:x value:nil table:nil]
#define YT_BUNDLE_ID @"com.google.ios.youtube"
#define YT_NAME @"YouTube"
// YTSpeed
@interface YTVarispeedSwitchControllerOption : NSObject
- (id)initWithTitle:(id)title rate:(float)rate;
@end
@interface MLHAMQueuePlayer : NSObject
@property id playerEventCenter;
@property id delegate;
- (void)setRate:(float)rate;
- (void)internalSetRate;
@end
@interface MLPlayerStickySettings : NSObject
- (void)setRate:(float)rate;
@end
@interface MLPlayerEventCenter : NSObject
- (void)broadcastRateChange:(float)rate;
@end
@interface HAMPlayerInternal : NSObject
- (void)setRate:(float)rate;
@end
// YTLitePlus
@interface YTChipCloudCell : UIView
@end
@interface YTPlayabilityResolutionUserActionUIController : NSObject // Skips content warning before playing *some videos - @PoomSmart
- (void)confirmAlertDidPressConfirm;
@end
@interface YTMainAppControlsOverlayView: UIView
@end
@interface YTTransportControlsButtonView : UIView
@end
@interface YTPlaybackButton : UIControl
@end
@interface YTSegmentableInlinePlayerBarView
@property (nonatomic, assign, readwrite) BOOL enableSnapToChapter;
@end
// Cercube button in Nav bar
@interface MDCButton : UIButton
@end
@interface YTRightNavigationButtons : UIView
@property (nonatomic, strong, readwrite) MDCButton *cercubeButton;
@property YTQTMButton *notificationButton;
@property YTQTMButton *sponsorBlockButton;
@end
// IAmYouTube
@interface SSOConfiguration : NSObject
@end
// BigYTMiniPlayer
@interface YTMainAppVideoPlayerOverlayView : UIView
- (UIViewController *)_viewControllerForAncestor;
@end
@interface YTWatchMiniBarView : UIView
@end
// YTAutoFullscreen
@interface YTPlayerViewController (YTAFS)
- (void)autoFullscreen;
@end
// YTNoShorts
@interface ELMCellNode
@end
@interface _ASCollectionViewCell : UICollectionViewCell
- (id)node;
@end
@interface YTAsyncCollectionView : UICollectionView
- (void)removeShortsCellAtIndexPath:(NSIndexPath *)indexPath;
@end
@interface YTPlayerView : UIView
- (void)downloadVideo;
@end
// App Theme
@interface YCHLiveChatView : UIView
@end
@interface YTFullscreenEngagementOverlayView : UIView
@end
@interface YTRelatedVideosView : UIView
@end
@interface ELMView: UIView
@end
@interface ASWAppSwitcherCollectionViewCell: UIView
@end
@interface ASScrollView : UIView
@end
@interface UIKeyboardLayoutStar : UIView
@end
@interface UIKeyboardDockView : UIView
@end
@interface _ASDisplayView : UIView
@end
@interface YTCommentDetailHeaderCell : UIView
@end
@interface SponsorBlockSettingsController : UITableViewController
@end
@interface SponsorBlockViewController : UIViewController
@end
@interface UICandidateViewController : UIViewController
@end
@interface UIPredictionViewController : UIViewController
@end

View file

@ -1,21 +1,18 @@
TARGET = iphone:clang:16.5:14.0
TARGET = iphone:clang:15.5:14.0
YTLitePlus_USE_FISHHOOK = 0
ARCHS = arm64
MODULES = jailed
FINALPACKAGE = 1
CODESIGN_IPA = 0
PACKAGE_VERSION = X.X.X-X.X
PACKAGE_VERSION = 18.23.3-2.0
TWEAK_NAME = YTLitePlus
DISPLAY_NAME = YouTube
BUNDLE_ID = com.google.ios.youtube
EXTRA_CFLAGS := $(addprefix -I,$(shell find Tweaks/FLEX -name '*.h' -exec dirname {} \;)) -I$(THEOS_PROJECT_DIR)/Tweaks
EXTRA_CFLAGS := $(addprefix -I,$(shell find Tweaks/FLEX -name '*.h' -exec dirname {} \;))
# Allow YouTubeHeader to be accessible using #include <...>
export ADDITIONAL_CFLAGS = -I$(THEOS_PROJECT_DIR)/Tweaks
YTLitePlus_INJECT_DYLIBS = Tweaks/YTLite/var/jb/Library/MobileSubstrate/DynamicLibraries/YTLite.dylib .theos/obj/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib .theos/obj/YTUHD.dylib .theos/obj/YouPiP.dylib .theos/obj/YouTubeDislikesReturn.dylib .theos/obj/YTABConfig.dylib .theos/obj/YouMute.dylib .theos/obj/DontEatMyContent.dylib .theos/obj/YTHoldForSpeed.dylib .theos/obj/YTVideoOverlay.dylib .theos/obj/YouGroupSettings.dylib .theos/obj/YouQuality.dylib .theos/obj/YouTimeStamp.dylib .theos/obj/YouLoop.dylib
YTLitePlus_INJECT_DYLIBS = .theos/obj/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib .theos/obj/YTUHD.dylib .theos/obj/YouPiP.dylib .theos/obj/YouTubeDislikesReturn.dylib .theos/obj/YTABConfig.dylib .theos/obj/YouMute.dylib .theos/obj/DontEatMyContent.dylib .theos/obj/YTHoldForSpeed.dylib .theos/obj/YTLite.dylib
YTLitePlus_FILES = YTLitePlus.xm $(shell find Source -name '*.xm' -o -name '*.x' -o -name '*.m') $(shell find Tweaks/FLEX -type f \( -iname \*.c -o -iname \*.m -o -iname \*.mm \))
YTLitePlus_IPA = ./tmp/Payload/YouTube.app
YTLitePlus_CFLAGS = -fobjc-arc -Wno-deprecated-declarations -Wno-unsupported-availability-guard -Wno-unused-but-set-variable -DTWEAK_VERSION=$(PACKAGE_VERSION) $(EXTRA_CFLAGS)
@ -23,18 +20,13 @@ YTLitePlus_FRAMEWORKS = UIKit Security
include $(THEOS)/makefiles/common.mk
include $(THEOS_MAKE_PATH)/tweak.mk
SUBPROJECTS += Tweaks/Alderis Tweaks/iSponsorBlock Tweaks/YTUHD Tweaks/YouPiP Tweaks/Return-YouTube-Dislikes Tweaks/YTABConfig Tweaks/YouMute Tweaks/DontEatMyContent Tweaks/YTHoldForSpeed Tweaks/YTVideoOverlay Tweaks/YouQuality Tweaks/YouTimeStamp Tweaks/YouGroupSettings Tweaks/YouLoop
SUBPROJECTS += Tweaks/Alderis Tweaks/iSponsorBlock Tweaks/YTUHD Tweaks/YouPiP Tweaks/Return-YouTube-Dislikes Tweaks/YTABConfig Tweaks/YouMute Tweaks/DontEatMyContent Tweaks/YTLite Tweaks/YTHoldForSpeed
include $(THEOS_MAKE_PATH)/aggregate.mk
YTLITE_PATH = Tweaks/YTLite
YTLITE_VERSION := 5.0.1
YTLITE_DEB = $(YTLITE_PATH)/com.dvntm.ytlite_$(YTLITE_VERSION)_iphoneos-arm64.deb
YTLITE_DYLIB = $(YTLITE_PATH)/var/jb/Library/MobileSubstrate/DynamicLibraries/YTLite.dylib
YTLITE_BUNDLE = $(YTLITE_PATH)/var/jb/Library/Application\ Support/YTLite.bundle
before-package::
@echo -e "==> \033[1mMoving tweak's bundle to Resources/...\033[0m"
@mkdir -p Resources/Frameworks/Alderis.framework && find .theos/obj/install/Library/Frameworks/Alderis.framework -maxdepth 1 -type f -exec cp {} Resources/Frameworks/Alderis.framework/ \;
@cp -R Tweaks/YTLite/var/jb/Library/Application\ Support/YTLite.bundle Resources/
@cp -R Tweaks/YTLite/layout/Library/Application\ Support/YTLite.bundle Resources/
@cp -R Tweaks/YTUHD/layout/Library/Application\ Support/YTUHD.bundle Resources/
@cp -R Tweaks/YouPiP/layout/Library/Application\ Support/YouPiP.bundle Resources/
@cp -R Tweaks/Return-YouTube-Dislikes/layout/Library/Application\ Support/RYD.bundle Resources/
@ -43,26 +35,8 @@ before-package::
@cp -R Tweaks/DontEatMyContent/layout/Library/Application\ Support/DontEatMyContent.bundle Resources/
@cp -R Tweaks/YTHoldForSpeed/layout/Library/Application\ Support/YTHoldForSpeed.bundle Resources/
@cp -R Tweaks/iSponsorBlock/layout/Library/Application\ Support/iSponsorBlock.bundle Resources/
@cp -R Tweaks/YTVideoOverlay/layout/Library/Application\ Support/YTVideoOverlay.bundle Resources/
@cp -R Tweaks/YouQuality/layout/Library/Application\ Support/YouQuality.bundle Resources/
@cp -R Tweaks/YouTimeStamp/layout/Library/Application\ Support/YouTimeStamp.bundle Resources/
@cp -R Tweaks/YouLoop/layout/Library/Application\ Support/YouLoop.bundle Resources/
@cp -R lang/YTLitePlus.bundle Resources/
@echo -e "==> \033[1mChanging the installation path of dylibs...\033[0m"
@ldid -r .theos/obj/iSponsorBlock.dylib && install_name_tool -change /usr/lib/libcolorpicker.dylib @rpath/libcolorpicker.dylib .theos/obj/iSponsorBlock.dylib
@codesign --remove-signature .theos/obj/libcolorpicker.dylib && install_name_tool -change /Library/Frameworks/Alderis.framework/Alderis @rpath/Alderis.framework/Alderis .theos/obj/libcolorpicker.dylib
internal-clean::
@rm -rf $(YTLITE_PATH)/*
before-all::
@if [[ ! -f $(YTLITE_DEB) ]]; then \
rm -rf $(YTLITE_PATH)/*; \
$(PRINT_FORMAT_BLUE) "Downloading YTLite"; \
echo "YTLITE_VERSION: $(YTLITE_VERSION)"; \
curl -s -L "https://github.com/dayanch96/YTLite/releases/download/v$(YTLITE_VERSION)/com.dvntm.ytlite_$(YTLITE_VERSION)_iphoneos-arm64.deb" -o $(YTLITE_DEB); \
tar -xf $(YTLITE_DEB) -C $(YTLITE_PATH); tar -xf $(YTLITE_PATH)/data.tar* -C $(YTLITE_PATH); \
if [[ ! -f $(YTLITE_DYLIB) || ! -d $(YTLITE_BUNDLE) ]]; then \
$(PRINT_FORMAT_ERROR) "Failed to extract YTLite"; exit 1; \
fi; \
fi

361
README.md
View file

@ -1,151 +1,296 @@
## YTLite with more features!
![IMAGE_CERCUBEPLUS_PREVIEW](https://gcdnb.pbrd.co/images/PnpTdZf0IXbd.png)
<p align="center">
<img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Banner.png" alt="YTLitePlus Banner" />
<img src="https://img.shields.io/badge/Platform-iOS%20%7C%20iPadOS%2014.0%2B-yellow" alt="Badge"/>
</p>
<a href="https://tinyurl.com/YTLiteAltstore"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Buttons/Altstore.png" height="70"></a>
&nbsp;
<a href="https://balackburn.github.io/YTLitePlus"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Buttons/Website.png" height="70"></a>
&nbsp;
<p align="center">
<a href="https://github.com/Balackburn/YTLitePlus/releases/latest"><img src="https://custom-icon-badges.demolab.com/github/v/release/arichorn/YTLitePlus?color=brightgreen&label=Latest%20release" alt="Badge"></img></a>
<a href="https://github.com/Balackburn/YTLitePlus/releases/latest"><img src="https://img.shields.io/github/downloads/arichorn/YTLitePlus/total?label=Download" alt="Badge"></img></a>
<a href="https://github.com/Balackburn/YTLitePlus/commit"><img src="https://custom-icon-badges.demolab.com/github/last-commit/arichorn/YTLitePlus?logo=history&logoColor=white&label=Last commit" alt="Badge"></img></a>
</p>
![GitHub issues](https://img.shields.io/github/issues-raw/Balackburn/YTLitePlus?style=flat&labelColor=%23000000&color=%23000000)
[![Platform](https://img.shields.io/badge/Platform-iOS%20%7C%20iPadOS%2014.0%2B-black?labelColor=black&style=flat)](https://developer.apple.com/iphone/index.action)
<a href="https://github.com/YTLitePlus/YTLitePlus/commit"><img src="https://custom-icon-badges.demolab.com/github/last-commit/Balackburn/YTLitePlus?style=flat&color=black&labelColor=black&logo=history&logoColor=white&label=Last commit" alt="Badge"></img></a>
<a href="https://github.com/YTLitePlus/YTLitePlus/releases/latest"><img src="https://custom-icon-badges.demolab.com/github/v/release/Balackburn/YTLitePlus?labelColor=black&style=flat&color=black&label=Latest%20release" alt="Badge"></img></a>
<p align="center">
<img src="https://img.shields.io/github/stars/arichorn/YTLitePlus?style=social" alt="Badge"/>
<img src="https://img.shields.io/github/forks/arichorn/YTLitePlus?style=social" alt="Badge"/>
<a href="https://github.com/qnblackcat/uYouPlus#support-the-developers"><img src="https://img.shields.io/badge/-Support-lightgrey?style=social&logo=paypal" alt="Badge"></img></a>
</p>
# Table of Contents
<a href="#credits"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Buttons/TableOfContents/Credits.png" width="170"></a>
<a href="#features"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Buttons/TableOfContents/Features.png" width="170"></a>
<a href="#altstore"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Buttons/TableOfContents/Altstore.png" width="170"></a>
<a href="#donations"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Buttons/TableOfContents/Donations.png" width="170"></a>
<a href="#building"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Buttons/TableOfContents/Building.png" width="170"></a>
* [Credits](#credits)
* [Features](#features)
* [Known issues](#known-issues)
* [Download (IPA)](#download-ipa)
* [Support the developers!](#support-the-developers)
* [Building (optional)](#building-optional)
# Credits
<table>
<tr>
<td align="center"><a href="https://github.com/dayanch96"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/dayanch96.png" width="100px;" alt="dayanch96"/></a></td>
<td align="center"><a href="https://github.com/Balackburn"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/Balackburn.png" width="100px;" alt="Balackburn"/></a></td>
<td align="center"><a href="https://github.com/arichornloverALT"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/arichornloverALT.png" width="100px;" alt="arichornloverALT"/></a></td>
<td align="center"><a href="https://github.com/PoomSmart"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/PoomSmart.png" width="100px;" alt="PoomSmart"/></a></td>
<td align="center"><a href="https://github.com/qnblackcat"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/qnblackcat.png" width="100px;" alt="qnblackcat"/></a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/SKEIDs"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/SKEIDs.png" width="100px;" alt="SKEIDs"/></a></td>
<td align="center"><a href="https://github.com/asdfzxcvbn"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/asdfzxcvbn.png" width="100px;" alt="asdfzxcvbn"/></a></td>
<td align="center"><a href="https://github.com/matt911"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/matt911.png" width="100px;" alt="matt911"/></a></td>
<td align="center"><a href="https://github.com/bhackel"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/bhackel.png" width="100px;" alt="bhackel"/></a></td>
<td align="center"><a href="https://github.com/AlexInABox"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/AlexInABox.png" width="100px;" alt="AlexInABox"/></a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/Glenta"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/Glenta.png" width="100px;" alt="Glenta"/></a></td>
<td align="center"><a href="https://github.com/gototheskinny"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/gototheskinny.png" width="100px;" alt="gototheskinny"/></a></td>
<td align="center"><a href="https://github.com/MrAlucardDante"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/MrAlucardDante.png" width="100px;" alt="MrAlucardDante"/></a></td>
<td align="center"><a href="https://github.com/Galactic-Dev"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/Galactic-Dev.png" width="100px;" alt="Galactic-Dev"/></a></td>
<td align="center"><a href="https://github.com/AhmedBafkir"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/AhmedBafkir.png" width="100px;" alt="AhmedBafkir"/></a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/MiRO92"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/MiRO92.png" width="100px;" alt="MiRO92"/></a></td>
<td align="center"><a href="https://github.com/ichitaso"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/ichitaso.png" width="100px;" alt="ichitaso"/></a></td>
<td align="center"><a href="https://github.com/Deci8BelioS"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/Deci8BelioS.png" width="100px;" alt="Deci8BelioS"/></a></td>
<td align="center"><a href="https://github.com/julioverne"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/julioverne.png" width="100px;" alt="julioverne"/></a></td>
<td align="center"><a href="https://github.com/therealFoxster"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/therealFoxster.png" width="100px;" alt="therealFoxster"/></a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/Lyvendia"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/Lyvendia.png" width="100px;" alt="Lyvendia"/></a></td>
<td align="center"><a href="https://github.com/ssuesskind"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/ssuesskind.png" width="100px;" alt="ssuesskind"/></a></td>
<td align="center"><a href="https://github.com/hbang"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/hbang.png" width="100px;" alt="hbang"/></a></td>
<td align="center"><a href="https://github.com/level3tjg"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/level3tjg.png" width="100px;" alt="level3tjg"/></a></td>
<td align="center"><a href="https://github.com/zSaaiq"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/zSaaiq.png" width="100px;" alt="zSaaiq"/></a></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/ISnackable"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/ISnackable.png" width="100px;" alt="ISnackable"/></a></td>
<td align="center"><a href="https://github.com/VictorxD70"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/VictorxD70.png" width="100px;" alt="VictorxD70"/></a></td>
<td align="center"><a href="https://github.com/Macleykun"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/Macleykun.png" width="100px;" alt="Macleykun"/></a></td>
<td align="center"><a href="https://github.com/BandarHL"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/BandarHL.png" width="100px;" alt="BandarHL"/></a></td>
<td align="center"><a href="https://github.com/CokePokes"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Credits/CokePokes.png" width="100px;" alt="CokePokes"/></a></td>
</tr>
<table id='maintainer credit'>
Special thanks to these developer(s) for maintaining and improving YTLitePlus (@qnblackcat is the OG dev)
<tr>
<td id='arichorn'>
<a href='https://github.com/arichorn'>
<img src='https://github.com/arichorn.png' width='140px;'>
</a>
<h4 align='center'><a href='https://github.com/arichorn'>arichorn</a></h4>
</td>
<td id='qnblackcat'>
<a href='https://github.com/qnblackcat'>
<img src='https://github.com/qnblackcat.png' width='140px;'>
</a>
<h4 align='center'><a href='https://github.com/qnblackcat'>Qnblackcat</a></h4>
</td>
<td id='dayanch96'>
<a href='https://github.com/dayanch96'>
<img src='https://github.com/dayanch96.png' width='140px;'>
</a>
<h4 align='center'><a href='https://github.com/dayanch96'>dayanch96</a></h4>
</td>
<td id='ssuesskind'>
<a href='https://github.com/ssuesskind'>
<img src='https://github.com/ssuesskind.png' width='140px;'>
</a>
<h4 align='center'><a href='https://github.com/ssuesskind'>ssuesskind</a></h4>
</td>
<table id='credit'>
Special thanks to all the developers who have contributed to CercubePlus/YTLitePlus!
(YTLite is an original tweak by dayanch96 @dayanch96)
<tr>
<td id='PoomSmart'>
<a href='https://github.com/PoomSmart'>
<img src='https://github.com/PoomSmart.png' width='140px;'>
</a>
<h4 align='center'><a href='https://github.com/PoomSmart'>PoomSmart</a></h4>
</td>
<td id='miro92'>
<a href='https://github.com/MiRO92'>
<img src='https://github.com/MiRO92.png' width='140px;'>
</a>
<h4 align='center'><a href='https://twitter.com/miro92'>MiRO92</a></h4>
</td>
<td id='level3tjg'>
<a href='https://github.com/level3tjg'>
<img src='https://github.com/level3tjg.png' width='140px;'>
</a>
<h4 align='center'><a href='https://twitter.com/level3tjg'>level3tjg</a></h4>
</td>
<td id='bandarHL'>
<a href='https://github.com/BandarHL'>
<img src='https://github.com/BandarHL.png' width='140px;'>
</a>
<h4 align='center'><a href='https://twitter.com/bandarhl'>BandarHelal</a></h4>
</td>
<td id='galactic-dev'>
<a href='https://github.com/Galactic-Dev'>
<img src='https://github.com/Galactic-Dev.png' width='140px;'>
</a>
<h4 align='center'><a href='https://twitter.com/dev_galactic'>galactic</a></h4>
</td>
</tr>
<tr>
<td id='hbang'>
<a href='https://github.com/hbang'>
<img src='https://github.com/hbang.png' width='140px;'>
</a>
<h4 align='center'><a href='https://twitter.com/hashbang'>HASHBANG</a></h4>
</td>
<td id='lyvendia'>
<a href='https://github.com/Lyvendia'>
<img src='https://github.com/Lyvendia.png' width='140px;'>
</a>
<h4 align='center'><a href='https://github.com/Lyvendia'>Lyvendia</a></h4>
</td>
<td id='foxster'>
<a href='https://github.com/therealFoxster'>
<img src='https://github.com/therealFoxster.png' width='140px;'>
</a>
<h4 align='center'><a href='https://twitter.com/therealFoxster'>Foxster</a></h4>
</td>
<td id='julioverne'>
<a href='https://github.com/julioverne'>
<img src='https://github.com/julioverne.png' width='140px;'>
</a>
<h4 align='center'><a href='https://twitter.com/ijulioverne'>julioverne</a></h4>
</td>
<td id='ichitaso'>
<a href='https://github.com/ichitaso'>
<img src='https://github.com/ichitaso.png' width='140px;'>
</a>
<h4 align='center'><a href='https://twitter.com/ichitaso'>ichitaso</a></h4>
</td>
</tr>
<tr>
<td id='ahmed-bafkir'>
<a href='https://github.com/AhmedBafkir'>
<img src='https://github.com/AhmedBafkir.png' width='140px;'>
</a>
<h4 align='center'><a href='https://twitter.com/Peaceful_0'>Ahmed Bafkir</a></h4>
</td>
<td id='cokepokes'>
<a href='https://github.com/CokePokes'>
<img src='https://github.com/CokePokes.png' width='140px;'>
</a>
<h4 align='center'><a href='https://twitter.com/cokepokes'>CokePokes</a></h4>
</td>
<td id='isnackable'>
<a href='https://github.com/ISnackable'>
<img src='https://github.com/ISnackable.png' width='140px;'>
</a>
<h4 align='center'><a href='https://isnackable.me/'>Tommy Teo</a></h4>
</td>
<td id='SKIEDs'>
<a href='https://github.com/SKEIDs'>
<img src='https://github.com/SKEIDs.png' width='140px;'>
</a>
<h4 align='center'><a href='https://github.com/SKEIDs'>SKIEDs</a></h4>
</td>
<td id='theos-team'>
<a href='https://github.com/theos/theos'>
<img src='https://github.com/theos.png' width='140px;'>
</a>
<h4 align='center'><a href='https://theos.dev'>theos</a></h4>
</td>
</tr>
</table>
# Features
1. **YTLite**: A tweak that enhances the YouTube experience by removing ads, enabling background playback and offering over 60 customization options.
1. **YTLite:**
2. **YTUHD**: This tweak unlocks 1440p (2K) and 2160p (4K) resolutions in the iOS YouTube app.
- Block all advertisements & Enable background playback.
3. **YouPiP**: Enables native Picture-in-Picture feature for videos in the YouTube app.
- Set default player quality on WiFi & Celullar.
4. **YTABConfig**: Adds a new section named "A/B" in the YouTube app settings where all features can be toggled freely by the user.
- Save videos in high resolution, save videos as audio-only, save public playlists (beta).
5. **YouMute**: Allows users to mute/unmute videos directly in the YouTube Video Player.
- And many more...
6. **DontEatMyContent**: Prevents the notch/Dynamic Island from covering 2:1 video content in YouTube.
2. **iSponsorBlock:** Skips annoying sponsor ads inside videos. iSponsorBlock is based on [SponsorBlock engine](https://sponsor.ajay.app/). Basically, this is the iOS version of the SponsorBlock extension.
7. **Return YouTube Dislikes**: Brings back Dislike counts under YouTube videos using ReturnYoutubeDislike's API.
3. **YouPiP:** enable YouTube's **native PiP**. More options are in YouTube Settings => General.
8. **iSponsorBlock**: Skips annoying sponsor ads inside YouTube videos.
4. **YTUHD:** unlock VP9 codec and in effect, enables video quality of 2K and 4K. You can configure YTUHD in YouTube's Settings - Video quality preferences.
9. **YouRememberCaption**: Makes YouTube remember your video caption setting.
5. **YouTube Dislike Return:** brings back Dislike counts under YouTube videos using **ReturnYoutubeDislike**'s API.
10. **YTNoTracking**: An iOS YouTube Tweak that disables Tracking Parameters in the YouTube App.
<details>
<summary>and many more...!</summary>
12. **YTNoCheckLocalNetWor**k: Blocks the Local Network permission popup in YouTube.
6. **YTClassicVideoQuality:** since YouTube v16.xx, you need one more step to change the video quality. YTClassicVideoQuality brings back the old video quality selector, which is a lot better than the new one.
13. **BigYTMiniPlayer**: Jailbreak tweak that makes the miniplayer in youtube easier to see.
7. **YTNoHoverCards:** offer an option to enable/disable the annoying suggested videos show up at the end of the videos.
14. **YTSpeed**: Adds 2.25x to 5x playback speed options in the YouTube video player.
8. **YTABGoodies:** allow you to disable some YouTube A/B testing features. It is a combination of several tweaks, such as:
15. **YTHoldForSpeed**: Allows you to quickly toggle between a selected video playback speed by tapping and holding on the video player in the YouTube application.
- YouAreThere: disable "Video paused. Continue watching?" popup in the YouTube app when you play a long video.
16. **YTVideoOverlay**: A helper tweak that adds buttons on the YouTube video overlay.
- YouRememberCaption: make YouTube remember your video caption setting (if not already).
17. **YouQuality**: Enables you to view and change video quality in YouTube faster.
- YTNoCheckLocalNetwork: block the Local Network permission popup.
18. **YTNoModernUI**: This tweak changes and removes some newer UI elements from the YouTube app such as some rounded buttons, old progress bar, and old buffer bar.
9. **NOYTPremium:** remove YouTube Premium upsell alerts.
19. **OLEDDarkmode**: Replace official Youtube darkmode with a true OLED darkmode.
10. **YTSpeed**: a toggleable tweak to add 2.25x, 2.5x, 2.75x, 3x, 3.25x, 3.5x, 3.75x, 4x & 5x playback speed options in the video player.
20. **OLDDarkmode**: Replace new official Youtube darkmode with old (grey) Youtube darkmode.
11. **YTMiniplayerEnabler**: enable Miniplayer for all YouTube videos.
21. **LowContrastMode**: Makes the UI interface look dimmer to make it easier on the eyes. (App Compatibility: v17.33.2-v17.38.10)
12. **DontEatMyContent**: prevent the notch/Dynamic Island from munching on 2:1 video content in YouTube.
# AltStore
13. **YTShortsProgress**: always enable progress bar and scrubbing in YouTube Shorts (iPhone only).
14. **YTABConfig**: allow user to control over YouTube A/B testing flags.
15. **YouMute**: Mute/unmute videos in the YouTube Video Player directly.
16. **LowContrastMode**: makes the YouTube Interface Low Contrast as possible to make it easier on the eyes.
any many more...
</details>
# Known issues
1. **YTLite**:
- Hide Cast button is not working. (Workaround: Hide cast button in CercubePlus settings)
- The Updated Dark Mode in the YouTube App is not Present or Working in YTLite v5.3.13 & older versions
2. **LowContrastMode**: this tweak doesn't work everywhere with every ui element on the YouTube App.
3. **YTUHD**: [Stuttering on 4K videos](https://github.com/qnblackcat/uYouPlus/issues/6).
4. **YouPiP** (iOS 14.0 - 14.4.2): due to Apple's fault, you may encounter the *speedup-bug* as described [here](https://drive.google.com/file/d/1NKdv1fr_KRWgD8nhkMDfG2eLBnbdeVtX/view?usp=sharing). The bug also happens when you try to play multi-sources of sound at the same time. Enable **LegacyPiP** is a workaround. Keep in mind that LegacyPiP also removes UHD quality and breaks YouTube Autoplay next. Use it at your own risk!
5. **Not a bug**:
- The app won't be able to receive push notifications if you use a free developer account to sideload it.
- It's impossible to fix deep-link (a.k.a Open in the YouTube app). However, you can use this [Shortcuts](https://shortcutsgallery.com/shortcuts/open-in-youtube/) as a workaround (tested on iOS 14). **Credit:** RandomAccessMemories#5025
# Download (IPA)
- **CercubePlus** (or you can call it YTLite+) requires iOS & iPadOS 14.0 and later. The latest version of **CercubePlus** can be found in the [Release tab](https://github.com/Balackburn/YTLitePlus/releases/latest).
- For AltStore user: [Open in AltStore (v18.18.2-5.3.11)](https://tinyurl.com/5a5jn7ra) - It will take a while to install because AltStore needs to download the IPA first.
<details>
<summary>Alternative Download</summary>
<a href="https://tinyurl.com/YTLiteAltstore"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Buttons/Altstore/Altstore.png" width="200"></a>
&nbsp;
[Open in AltStore (v18.14.1-5.3.11-F2)](https://tinyurl.com/4exxknn8) - This is the **v18.14.1-5.3.11-F2** release. only use this to resolve the OLED/OLD Dark Mode Problem.
<a href="https://altsource.by.lao.sb/browse/?source=https://raw.githubusercontent.com/Balackburn/YTLitePlusAltstore/main/apps.json"><img src="https://github.com/YTLitePlus/Assets/blob/main/Github/Buttons/Altstore/altsource.by.lao.sb.png" width="200"></a>
&nbsp;
</details>
<a href="https://raw.githubusercontent.com/Balackburn/YTLitePlusAltstore/main/apps.json"><img src="https://github.com/YTLitePlus/Assets/blob/main/Github/Buttons/Altstore/URL.png" width="200"></a>
- Version info: _(May 9 2023)_
# Donations
<a href="https://buymeacoffee.com/dayanch96"><img src="https://github.com/YTLitePlus/Assets/blob/main/Github/Buttons/Donations/Dayanch96(buymeacoffee).png" width="200"></a>
&nbsp;
<a href="https://github.com/sponsors/dayanch96"><img src="https://github.com/YTLitePlus/Assets/blob/main/Github/Buttons/Donations/Dayanch96(Github).png" width="200"></a>
<details>
<summary>Expand!</summary>
<a href="https://ko-fi.com/dayanch966"><img src="https://github.com/YTLitePlus/Assets/blob/main/Github/Buttons/Donations/Dayanch96(ko-fi).png" width="200"></a>
&nbsp;
<a href="https://www.paypal.com/paypalme/poomsmart"><img src="https://github.com/YTLitePlus/Assets/blob/main/Github/Buttons/Donations/Poomsmart.png" width="200"></a>
| **Tweaks/App** | **Developer** | **Version** | **Open source** |
| - | - | :-: | :-: |
| **YouTube** | Google Inc | 18.21.3 | ✖︎ |
| **YTLite** | Majd Alfhaily | 5.3.11 | ✖︎ |
| **Open in YouTube** | [CokePokes](https://github.com/CokePokes/) | 1.2 | ✖︎ |
| **YTNoShorts** | [MiRO92](https://twitter.com/miro92) | 1.0.2 | [✔︎](https://github.com/MiRO92/YTNoShorts) |
| **iSponsorBlock** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.0-15 | [✔︎](https://github.com/Galactic-Dev/iSponsorBlock) |
| **BigYTMiniPlayer** | [Galactic-Dev](https://github.com/Galactic-Dev) | 1.0-1 | [✔︎](https://github.com/Galactic-Dev/BigYTMiniPlayer) |
| **YTNoHoverCards** | [level3tjg](https://twitter.com/level3tjg) | 0.0.3 | [✔︎](https://github.com/level3tjg/YTNoHoverCards) |
| **YTMiniplayerEnabler** | [level3tjg](https://twitter.com/level3tjg) | 0.0.2 | [✔︎](https://github.com/level3tjg/YTMiniplayerEnabler) |
| **DontEatMyContent** | [therealFoxster](https://github.com/therealFoxster) | 1.0.6 | [✔︎](https://github.com/therealFoxster/DontEatMyContent) |
| **LowContrastMode** | arichorn | 1.2.3 | [✔︎](https://github.com/arichorn/LowContrastMode) |
| **YTUHD** | PoomSmart | 1.4.0 | [✔︎](https://github.com/PoomSmart/YTUHD) |
| **YouPiP** | PoomSmart | 1.7.19-2 | [✔︎](https://github.com/PoomSmart/YouPiP) |
| **YouMute** | PoomSmart | 1.1.1-1 | [✔︎](https://github.com/PoomSmart/YouMute) |
| **YTABConfig** | PoomSmart | 1.5.0-1 | [✔︎](https://github.com/PoomSmart/YTABConfig) |
| **IAmYouTube** | PoomSmart | 1.2.0 | [✔︎](https://github.com/PoomSmart/IAmYouTube) |
| **YTReExplore** | PoomSmart | 1.0.2 | [✔︎](https://github.com/PoomSmart/YTReExplore) |
| **NoYTPremium** | PoomSmart | 1.0.4 | [✔︎](https://github.com/PoomSmart/NoYTPremium) |
| **YTNoPaidPromo** | PoomSmart | 1.0.0 | [✔︎](https://github.com/PoomSmart/YTNoPaidPromo) |
| **YTAutoFullScreen** | PoomSmart | 1.0.3 | [✔︎](https://github.com/PoomSmart/YTAutoFullScreen) |
| **YTShortsProgress** | PoomSmart | 1.0.2 | [✔︎](https://github.com/PoomSmart/YTShortsProgress) |
| **Return YouTube Dislike** | PoomSmart | 1.11.3 | [✔︎](https://github.com/PoomSmart/Return-YouTube-Dislikes) |
<a href="https://www.paypal.com/paypalme/DBrett684"><img src="https://github.com/YTLitePlus/Assets/blob/main/Github/Buttons/Donations/Galactic-dev(Paypal).png" width="200"></a>
&nbsp;
<a href="https://venmo.com/u/DavidBrett"><img src="https://github.com/YTLitePlus/Assets/blob/main/Github/Buttons/Donations/Galactic-dev(Venmo).png?raw=true" width="200"></a>
</details>
# Support the developers
- [**MiRO92**](https://twitter.com/miro92): https://github.com/MiRO92/uYou-for-YouTube#support
- [**level3tjg**](https://twitter.com/level3tjg): https://ko-fi.com/level3tjg
- [**BandarHL**](https://twitter.com/bandarhl): https://www.paypal.com/paypalme/BandarHL
- [**julioverne**](https://twitter.com/ijulioverne): https://www.patreon.com/julioverne
- [**Galactic-dev**](https://twitter.com/dev_galactic):
- Paypal: https://www.paypal.com/paypalme/DBrett684
- Venmo: https://venmo.com/u/DavidBrett
<a href="https://github.com/MiRO92/uYou-for-YouTube#support"><img src="https://raw.githubusercontent.com/YTLitePlus/Assets/main/Github/Buttons/Donations/MIRO92.png" width="200"></a>
&nbsp;
<a href="https://www.paypal.com/paypalme/BandarHL"><img src="https://github.com/YTLitePlus/Assets/blob/main/Github/Buttons/Donations/BandarHL.png" width="200"></a>
&nbsp;
<a href="https://ko-fi.com/level3tjg"><img src="https://github.com/YTLitePlus/Assets/blob/main/Github/Buttons/Donations/level3tjg.png?raw=true" width="200"></a>
&nbsp;
<a href="https://www.patreon.com/julioverne"><img src="https://github.com/YTLitePlus/Assets/blob/main/Github/Buttons/Donations/julioverne.png?raw=true" width="200"></a>
# Building
# Building(s) (optional)
See [YTLitePlus/Building - Wiki](https://github.com/Balackburn/YTLitePlus/wiki/Building)
or Another Version [uYouPlus/Building - Wiki](https://github.com/qnblackcat/uYouPlus/wiki/Building)

42
Source/Download.xm.bak Normal file
View file

@ -0,0 +1,42 @@
// Code has been disabled due to some compiling errors.
#import "../Header.h"
%ctor {
void $YTPlayerView_downloadVideo_register();
void $YTPlayerView_layoutSubviews$_register();
}
#ifndef YTPLAYERVIEW_DOWNLOADVIDEO_REGISTER
#ifndef YTPLAYERVIEW_LAYOUTSUBVIEWS_REGISTER
#define YTPLAYERVIEW_DOWNLOADVIDEO_REGISTER
#define YTPLAYERVIEW_LAYOUTSUBVIEWS_REGISTER
void $YTPlayerView_downloadVideo_register();
void $YTPlayerView_layoutSubviews$_register();
#endif
// YouTube Video Downloading
CHDeclareClass(YTPlayerView);
CHOptimizedMethod1(self, void, YTPlayerView, layoutSubviews, BOOL, arg1)
{
CHSuper1(YTPlayerView, layoutSubviews, arg1);
CGRect downloadButtonFrame = CGRectMake(0, 0, 100, 50);
UIButton *downloadButton = [[UIButton alloc] initWithFrame:downloadButtonFrame];
[downloadButton setTitle:@"Download" forState:UIControlStateNormal];
[downloadButton addTarget:self action:@selector(downloadVideo) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:downloadButton];
}
CHOptimizedMethod0(self, void, YTPlayerView, downloadVideo)
{
NSString *videoUrlString = @"[Insert YouTube video URL here]";
NSURL *videoUrl = [NSURL URLWithString:videoUrlString];
NSData *videoData = [NSData dataWithContentsOfURL:videoUrl];
// Save the video data to a file
NSString *filePath = @"[Insert file path here]";
[videoData writeToFile:filePath atomically:YES];
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,55 +0,0 @@
#import "../YTLitePlus.h"
// Keys for "Copy Settings" button (for: YTLitePlus)
// In alphabetical order for tweaks after YTLitePlus
NSArray *NSUserDefaultsCopyKeys = @[
// YTLitePlus - gathered using get_keys.py
@"YTTapToSeek_enabled", @"alwaysShowRemainingTime_enabled", @"bigYTMiniPlayer_enabled", @"castConfirm_enabled",
@"disableAccountSection_enabled", @"disableAmbientModeFullscreen_enabled",
@"disableAmbientModePortrait_enabled", @"disableAutoplaySection_enabled", @"disableCollapseButton_enabled",
@"disableEngagementOverlay_enabled", @"disableLiveChatSection_enabled",
@"disableManageAllHistorySection_enabled", @"disableNotificationsSection_enabled",
@"disablePrivacySection_enabled", @"disablePullToFull_enabled", @"disableRemainingTime_enabled",
@"disableTryNewFeaturesSection_enabled", @"disableVideoQualityPreferencesSection_enabled",
@"disableYourDataInYouTubeSection_enabled", @"enableSaveToButton_enabled", @"enableShareButton_enabled",
@"enableVersionSpoofer_enabled", @"fixCasting_enabled", @"flex_enabled", @"fullscreenToTheRight_enabled",
@"hideAutoplayMiniPreview_enabled", @"hideCastButton_enabled", @"hideHUD_enabled", @"hideHeatwaves_enabled",
@"hideHomeTab_enabled", @"hidePreviewCommentSection_enabled", @"hideRightPanel_enabled",
@"hideSpeedToast_enabled", @"hideSponsorBlockButton_enabled", @"hideVideoPlayerShadowOverlayButtons_enabled",
@"iPadLayout_enabled", @"iPhoneLayout_enabled", @"inline_muted_playback_enabled", @"lowContrastMode_enabled",
@"newSettingsUI_enabled", @"oledKeyBoard_enabled", @"playerGesturesHapticFeedback_enabled",
@"playerGestures_enabled", @"seekAnywhere_enabled", @"switchCopyandPasteFunctionality_enabled",
@"videoPlayerButton_enabled", @"ytNoModernUI_enabled", @"ytStartupAnimation_enabled",
// DEMC - https://github.com/therealFoxster/DontEatMyContent/blob/master/Tweak.h
@"DEMC_enabled", @"DEMC_colorViewsEnabled", @"DEMC_safeAreaConstant", @"DEMC_disableAmbientMode",
@"DEMC_limitZoomToFill", @"DEMC_enableForAllVideos",
// iSponsorBlock cannot be exported using this method - it is also being removed in v5
// Return-YouTube-Dislike - https://github.com/PoomSmart/Return-YouTube-Dislikes/blob/main/TweakSettings.h
@"RYD-ENABLED", @"RYD-VOTE-SUBMISSION", @"RYD-EXACT-LIKE-NUMBER", @"RYD-EXACT-NUMBER",
// All YTVideoOverlay Tweaks - https://github.com/PoomSmart/YTVideoOverlay/blob/0fc6d29d1aa9e75f8c13d675daec9365f753d45e/Tweak.x#L28C1-L41C84
@"YTVideoOverlay-YouLoop-Enabled", @"YTVideoOverlay-YouTimeStamp-Enabled", @"YTVideoOverlay-YouMute-Enabled",
@"YTVideoOverlay-YouQuality-Enabled", @"YTVideoOverlay-YouLoop-Position", @"YTVideoOverlay-YouTimeStamp-Position",
@"YTVideoOverlay-YouMute-Position", @"YTVideoOverlay-YouQuality-Position",
// YouPiP - https://github.com/PoomSmart/YouPiP/blob/main/Header.h
@"YouPiPPosition", @"CompatibilityModeKey", @"PiPActivationMethodKey", @"PiPActivationMethod2Key",
@"NoMiniPlayerPiPKey", @"NonBackgroundableKey",
// YTABConfig cannot be reasonably exported using this method
// YTHoldForSpeed will be removed in v5
// YouTube Plus / YTLite cannot be exported using this method
// YTUHD - https://github.com/PoomSmart/YTUHD/blob/master/Header.h
@"EnableVP9", @"AllVP9",
// Useful YouTube Keys
@"inline_muted_playback_enabled",
];
// Some default values to ignore when exporting settings
NSDictionary *NSUserDefaultsCopyKeysDefaults = @{
@"fixCasting_enabled": @1,
@"inline_muted_playback_enabled": @5,
@"newSettingsUI_enabled": @1,
@"DEMC_safeAreaConstant": @21.5,
@"RYD-ENABLED": @1,
@"RYD-VOTE-SUBMISSION": @1,
// Duplicate keys are not allowed in NSDictionary. If present, only the last one will be kept.
};

File diff suppressed because it is too large Load diff

View file

@ -1,107 +0,0 @@
#import "../YTLitePlus.h"
static int appVersionSpoofer() {
return [[NSUserDefaults standardUserDefaults] integerForKey:@"versionSpoofer"];
}
static BOOL version0() {
return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 0;
}
static BOOL version1() {
return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 1;
}
static BOOL version2() {
return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 2;
}
static BOOL version3() {
return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 3;
}
static BOOL version4() {
return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 4;
}
static BOOL version5() {
return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 5;
}
static BOOL version6() {
return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 6;
}
static BOOL version7() {
return IsEnabled(@"enableVersionSpoofer_enabled") && appVersionSpoofer() == 7;
}
%group gVersion0
%hook YTVersionUtils // Last v18 App Version
+ (NSString *)appVersion { return @"18.49.3"; }
%end
%end
%group gVersion1
%hook YTVersionUtils // Brings back Library Tab
+ (NSString *)appVersion { return @"18.34.5"; }
%end
%end
%group gVersion2
%hook YTVersionUtils // Removes Playables in Explore
+ (NSString *)appVersion { return @"18.33.3"; }
%end
%end
%group gVersion3
%hook YTVersionUtils // Fixes YTClassicVideoQuality + YTSpeed
+ (NSString *)appVersion { return @"18.18.2"; }
%end
%end
%group gVersion4
%hook YTVersionUtils // First v18 App Version
+ (NSString *)appVersion { return @"18.01.2"; }
%end
%end
%group gVersion5
%hook YTVersionUtils // Last v17 App Version
+ (NSString *)appVersion { return @"17.49.6"; }
%end
%end
%group gVersion6
%hook YTVersionUtils // v17.38.10 Fixes LowContrastMode + No Rounded Thumbnails
+ (NSString *)appVersion { return @"17.38.10"; }
%end
%end
%group gVersion7
%hook YTVersionUtils // Oldest Supported App Version (v17)
+ (NSString *)appVersion { return @"17.33.2"; }
%end
%end
# pragma mark - ctor
%ctor {
%init;
if (version0()) { // 0
%init(gVersion0);
}
if (version1()) { // 1
%init(gVersion1);
}
if (version2()) { // 2
%init(gVersion2);
}
if (version3()) { // 3
%init(gVersion3);
}
if (version4()) { // 4
%init(gVersion4);
}
if (version5()) { // 5
%init(gVersion5);
}
if (version6()) { // 6
%init(gVersion6);
}
if (version7()) { // 7
%init(gVersion7);
}
}

View file

@ -1,100 +0,0 @@
import re
import os
def extract_values_from_file(file_path):
"""
Extracts keys that match the pattern @\"<some_text>_enabled\" from the given file.
Args:
file_path (str): The path to the file to be searched.
Returns:
list: A list of matching keys found in the file.
"""
# Define the regex pattern to match the strings that resemble the given examples
pattern = r'@\"[a-zA-Z0-9_]+_enabled\"'
matches = []
try:
# Read the content of the file
with open(file_path, 'r') as file:
file_content = file.read()
# Find all matches
matches = re.findall(pattern, file_content)
except Exception as e:
print(f"Error reading {file_path}: {e}")
return matches
def format_output(keys):
"""
Formats the keys with indentation and line breaks if the segment exceeds 120 characters (116 excluding indentation).
Args:
keys (list): The list of keys to be formatted.
Returns:
str: A formatted string with the keys.
"""
indent = " " * 4
line_length_limit = 116 # Limit excluding indentation
current_line = indent
formatted_output = ""
for key in keys:
# Check if adding the next key would exceed the line length limit
if len(current_line) + len(key) + 2 > line_length_limit: # +2 accounts for the comma and space
# Add the current line to the formatted output and start a new line
formatted_output += current_line.rstrip(", ") + ",\n"
current_line = indent # Start a new indented line
# Add the key to the current line
current_line += key + ", "
# Add the last line to the output
formatted_output += current_line.rstrip(", ") # Remove trailing comma and space from the final line
return formatted_output
def find_and_extract_keys():
"""
Recursively searches for .xm and .h files in the parent directory and extracts keys
that match the pattern @\"<some_text>_enabled\". The matching keys are then printed
with indentation and line breaks if the line exceeds 120 characters.
Ignores SettingsKeys.h
Usage:
1. Place this script in the desired directory.
2. Run the script with the command: python extract_keys.py
3. The script will search for all .xm and .h files in the parent directory and
print any matching keys it finds.
Note:
- The script searches the directory where it is located (the parent directory).
- It only looks for files with extensions .xm and .h.
"""
# Get the parent directory
parent_directory = os.path.dirname(os.path.abspath(__file__))
# Store the found keys
found_keys = set() # Use a set to automatically remove duplicates
# Walk through the parent directory and find all .xm and .h files
for root, dirs, files in os.walk(parent_directory):
for file in files:
if file.endswith(('.xm', '.h')):
# Skip SettingsKeys.h
if file == "SettingsKeys.h":
continue
file_path = os.path.join(root, file)
found_keys.update(extract_values_from_file(file_path))
# Print the found keys with formatting
if found_keys:
sorted_keys = sorted(found_keys)
print(format_output(sorted_keys))
else:
print("No keys found.")
if __name__ == "__main__":
find_and_extract_keys()

@ -1 +0,0 @@
Subproject commit 15b061bf414cf29fd0d4e0e124e9e2ccb99326b0

16
Tweaks/Alderis/.gitignore vendored Normal file
View file

@ -0,0 +1,16 @@
# Crap
.DS_Store
# Xcode
*.pbxuser
!default.pbxuser
xcuserdata
*.xccheckout
*.xcuserstate
# Carthage
Carthage/
# Theos
.theos
packages/

View file

@ -0,0 +1,36 @@
clean: true
author: HASHBANG Productions
author_url: https://hbang.github.io/
github_url: https://github.com/hbang/Alderis
root_url: https://hbang.github.io/Alderis/
dash_url: https://hbang.github.io/Alderis/docsets/Alderis.xml
documentation: info/*.md
hide_documentation_coverage: true
custom_categories:
- name: "Guides"
children:
- "Preference Bundles"
- "Migrating to 1.1"
- name: "Color Picker"
children:
- ColorPickerViewController
- ColorPickerConfiguration
- ColorPickerDelegate
- ColorPickerTab
- name: "UI Components"
children:
- ColorWell
- name: "Extensions"
children:
- UIColor
- ColorPropertyListValue
- String
- Array
- name: "Deprecated"
children:
- ColorPickerCircleView

View file

@ -0,0 +1,61 @@
disabled_rules:
- trailing_comma
- nesting
- fallthrough
- shorthand_operator
- todo
- large_tuple
- identifier_name
- type_name
- type_body_length
# TODO: Why is vertical_parameter_alignment giving false positives?
- vertical_parameter_alignment
- vertical_parameter_alignment_on_call
# TODO: Enable when removing support for older Swift versions (<5.6)
- unavailable_condition
opt_in_rules:
- closure_end_indentation
- closure_spacing
- contains_over_first_not_nil
- empty_count
- explicit_init
- fatal_error_message
- first_where
- joined_default_parameter
- literal_expression_end_indentation
- overridden_super_call
- prohibited_super_call
- sorted_first_last
- unneeded_parentheses_in_closure_argument
- vertical_parameter_alignment_on_call
- yoda_condition
- nslocalizedstring_key
- unused_setter_value
custom_rules:
comment_whitespace:
name: "Comment Whitespace"
regex: //\S
match_kinds: comment
message: "Comments must begin with a whitespace character"
spaces_not_tabs:
name: "Tabs not Spaces"
regex: ^( )
message: "Use tabs instead of spaces"
point_zero:
name: "Point Zero"
regex: '(?<!iOS\s)(?<!macOS\s)(?<!\.)\b[\d_]+\.0\b'
match_kinds:
- number
- attribute.builtin
message: "Don't add a .0 to the end of floating point literals"
color_init:
name: "Color Initializer"
regex: 'UIColor\(red: (.+), green: \1, blue: \1, alpha: .+\)'
message: "Use UIColor(white:alpha:)"
force_try: warning
force_cast: warning
function_body_length: 200
line_length: 200
file_length: 450
cyclomatic_complexity: 12
function_parameter_count: 7

View file

@ -0,0 +1,30 @@
Pod::Spec.new do |spec|
spec.name = "Alderis"
spec.version = "1.2.0"
spec.summary = "A fresh new color picker, with a gentle, fun, and dead simple user interface."
spec.description = <<-DESC
Alderis is a fresh new color picker, with a gentle, fun, and dead simple user
interface. It aims to incorporate the usual elements of a color picker, in a way
that users will find easy and fun to use.
The user can start by selecting a color they like on the initial color palette
tab, and either accept it, or refine it using the color wheel and adjustment
sliders found on the two other tabs.
DESC
spec.homepage = "https://github.com/hbang/Alderis"
spec.screenshots = "https://github.com/hbang/Alderis/raw/main/screenshots/alderis-1.jpg",
"https://github.com/hbang/Alderis/raw/main/screenshots/alderis-2.jpg",
"https://github.com/hbang/Alderis/raw/main/screenshots/alderis-3.jpg",
"https://github.com/hbang/Alderis/raw/main/screenshots/alderis-4.jpg"
spec.license = "Apache License, Version 2.0"
spec.author = "HASHBANG Productions"
spec.social_media_url = "https://twitter.com/hashbang"
spec.swift_versions = "5.0"
spec.platform = :ios, "12.0"
spec.source = { :git => "https://github.com/hbang/Alderis.git", :tag => "#{spec.version}" }
spec.requires_arc = true
spec.source_files = [ "Alderis/*.swift", "Alderis/*.h" ]
spec.resource_bundles = { "Alderis" => "Alderis/Assets-ios12.xcassets" }
end

View file

@ -0,0 +1,482 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 52;
objects = {
/* Begin PBXBuildFile section */
4E1C741328266C5900227EC3 /* UIFontDescriptorAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1C741228266C5900227EC3 /* UIFontDescriptorAdditions.swift */; };
4E1C74172826C1F100227EC3 /* ColorPickerAccessibilityViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1C74162826C1F100227EC3 /* ColorPickerAccessibilityViewController.swift */; };
4E1C741928276D5600227EC3 /* TextViewLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1C741828276D5600227EC3 /* TextViewLabel.swift */; };
4E1C741B2827829E00227EC3 /* AccessibilityComplianceLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1C741A2827829E00227EC3 /* AccessibilityComplianceLabel.swift */; };
4E1C741D2827882600227EC3 /* AccessibilityContrastSelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1C741C2827882600227EC3 /* AccessibilityContrastSelector.swift */; };
4E1C741F2827B3C800227EC3 /* UIFloat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1C741E2827B3C800227EC3 /* UIFloat.swift */; };
4E1C74212827B8F800227EC3 /* NSBeep.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1C74202827B8F800227EC3 /* NSBeep.swift */; };
4E2E6C06282BD5990089E4FB /* GradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E2E6C05282BD5990089E4FB /* GradientView.swift */; };
569C25522427F57000022C60 /* ColorPickerTabViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 569C25512427F57000022C60 /* ColorPickerTabViewController.swift */; };
569C25582428346900022C60 /* ColorPickerMapSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 569C25572428346900022C60 /* ColorPickerMapSlider.swift */; };
56C74667242F722A003ED00A /* ColorPickerSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56C74666242F722A003ED00A /* ColorPickerSlider.swift */; };
56C74669242F75E3003ED00A /* ColorPickerNumericSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56C74668242F75E3003ED00A /* ColorPickerNumericSlider.swift */; };
94A2368C252B5951002B5D0B /* UIColorAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94A2368B252B5951002B5D0B /* UIColorAdditions.swift */; };
CF73D33A241F9C23000B1B10 /* Alderis.h in Headers */ = {isa = PBXBuildFile; fileRef = CF73D338241F9C23000B1B10 /* Alderis.h */; settings = {ATTRIBUTES = (Public, ); }; };
CF73D344241F9C31000B1B10 /* ColorWell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF73D32D241E49EE000B1B10 /* ColorWell.swift */; };
CF73D345241F9C31000B1B10 /* ColorPickerMapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE70280241CBDE700083903 /* ColorPickerMapViewController.swift */; };
CF73D346241F9C31000B1B10 /* ColorPickerSlidersViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE70282241CC88D00083903 /* ColorPickerSlidersViewController.swift */; };
CF73D347241F9C31000B1B10 /* ColorPickerWheelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE70288241D0E7300083903 /* ColorPickerWheelView.swift */; };
CF73D348241F9C31000B1B10 /* ColorPickerInnerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE7027B241A62ED00083903 /* ColorPickerInnerViewController.swift */; };
CF73D34A241F9C31000B1B10 /* ColorPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE70273241A4C5500083903 /* ColorPickerViewController.swift */; };
CF73D34B241F9C31000B1B10 /* ColorPickerSwatchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE7027E241B984600083903 /* ColorPickerSwatchViewController.swift */; };
CF73D34C241F9C4D000B1B10 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF73D32B241E4720000B1B10 /* Color.swift */; };
CF73D351241F9FB3000B1B10 /* ColorPickerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF73D350241F9FB3000B1B10 /* ColorPickerDelegate.swift */; };
CF7750B72520D3B50069CC57 /* Assets.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF7750B62520D3B50069CC57 /* Assets.swift */; };
CF7750BE252203630069CC57 /* DialogButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF7750BD252203630069CC57 /* DialogButton.swift */; };
CF7750CF252433680069CC57 /* ColorPickerConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF7750CE252433680069CC57 /* ColorPickerConfiguration.swift */; };
CF7750D62524615D0069CC57 /* SeparatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF7750D52524615D0069CC57 /* SeparatorView.swift */; };
CF775122252852460069CC57 /* AlderisSDKCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = CF775121252852110069CC57 /* AlderisSDKCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; };
CF79DA31251723C500F17BCB /* BottomSheetTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF79DA30251723C500F17BCB /* BottomSheetTransition.swift */; };
CFAFFC9124277CEE005AD4C1 /* Assets-ios12.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CFAFFC9024277CEE005AD4C1 /* Assets-ios12.xcassets */; platformFilter = ios; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
4E1C741228266C5900227EC3 /* UIFontDescriptorAdditions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIFontDescriptorAdditions.swift; sourceTree = "<group>"; };
4E1C74162826C1F100227EC3 /* ColorPickerAccessibilityViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerAccessibilityViewController.swift; sourceTree = "<group>"; };
4E1C741828276D5600227EC3 /* TextViewLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextViewLabel.swift; sourceTree = "<group>"; };
4E1C741A2827829E00227EC3 /* AccessibilityComplianceLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessibilityComplianceLabel.swift; sourceTree = "<group>"; };
4E1C741C2827882600227EC3 /* AccessibilityContrastSelector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessibilityContrastSelector.swift; sourceTree = "<group>"; };
4E1C741E2827B3C800227EC3 /* UIFloat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIFloat.swift; sourceTree = "<group>"; };
4E1C74202827B8F800227EC3 /* NSBeep.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSBeep.swift; sourceTree = "<group>"; };
4E2E6C05282BD5990089E4FB /* GradientView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradientView.swift; sourceTree = "<group>"; };
569C25512427F57000022C60 /* ColorPickerTabViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerTabViewController.swift; sourceTree = "<group>"; };
569C25572428346900022C60 /* ColorPickerMapSlider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerMapSlider.swift; sourceTree = "<group>"; };
56C74666242F722A003ED00A /* ColorPickerSlider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerSlider.swift; sourceTree = "<group>"; };
56C74668242F75E3003ED00A /* ColorPickerNumericSlider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerNumericSlider.swift; sourceTree = "<group>"; };
94A2368B252B5951002B5D0B /* UIColorAdditions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIColorAdditions.swift; sourceTree = "<group>"; };
CF73D32B241E4720000B1B10 /* Color.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Color.swift; sourceTree = "<group>"; };
CF73D32D241E49EE000B1B10 /* ColorWell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorWell.swift; sourceTree = "<group>"; };
CF73D336241F9C23000B1B10 /* Alderis.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alderis.framework; sourceTree = BUILT_PRODUCTS_DIR; };
CF73D338241F9C23000B1B10 /* Alderis.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Alderis.h; sourceTree = "<group>"; };
CF73D339241F9C23000B1B10 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
CF73D350241F9FB3000B1B10 /* ColorPickerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerDelegate.swift; sourceTree = "<group>"; };
CF7750B62520D3B50069CC57 /* Assets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Assets.swift; sourceTree = "<group>"; };
CF7750BD252203630069CC57 /* DialogButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DialogButton.swift; sourceTree = "<group>"; };
CF7750CE252433680069CC57 /* ColorPickerConfiguration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ColorPickerConfiguration.swift; sourceTree = "<group>"; };
CF7750D52524615D0069CC57 /* SeparatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SeparatorView.swift; sourceTree = "<group>"; };
CF775121252852110069CC57 /* AlderisSDKCompatibility.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AlderisSDKCompatibility.h; sourceTree = "<group>"; };
CF79DA30251723C500F17BCB /* BottomSheetTransition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomSheetTransition.swift; sourceTree = "<group>"; };
CFAFFC9024277CEE005AD4C1 /* Assets-ios12.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Assets-ios12.xcassets"; sourceTree = "<group>"; };
CFE70273241A4C5500083903 /* ColorPickerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerViewController.swift; sourceTree = "<group>"; };
CFE7027B241A62ED00083903 /* ColorPickerInnerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerInnerViewController.swift; sourceTree = "<group>"; };
CFE7027E241B984600083903 /* ColorPickerSwatchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerSwatchViewController.swift; sourceTree = "<group>"; };
CFE70280241CBDE700083903 /* ColorPickerMapViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerMapViewController.swift; sourceTree = "<group>"; };
CFE70282241CC88D00083903 /* ColorPickerSlidersViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerSlidersViewController.swift; sourceTree = "<group>"; };
CFE70288241D0E7300083903 /* ColorPickerWheelView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorPickerWheelView.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
CF73D333241F9C23000B1B10 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
CF39D435222BC07C001EF57F = {
isa = PBXGroup;
children = (
CF73D337241F9C23000B1B10 /* Alderis */,
CF39D43F222BC07C001EF57F /* Products */,
);
indentWidth = 2;
sourceTree = "<group>";
tabWidth = 2;
usesTabs = 1;
};
CF39D43F222BC07C001EF57F /* Products */ = {
isa = PBXGroup;
children = (
CF73D336241F9C23000B1B10 /* Alderis.framework */,
);
name = Products;
sourceTree = "<group>";
};
CF73D337241F9C23000B1B10 /* Alderis */ = {
isa = PBXGroup;
children = (
CF73D338241F9C23000B1B10 /* Alderis.h */,
CF775121252852110069CC57 /* AlderisSDKCompatibility.h */,
CF7750B62520D3B50069CC57 /* Assets.swift */,
CF79DA30251723C500F17BCB /* BottomSheetTransition.swift */,
CF73D32B241E4720000B1B10 /* Color.swift */,
CFE70273241A4C5500083903 /* ColorPickerViewController.swift */,
CF7750CE252433680069CC57 /* ColorPickerConfiguration.swift */,
CF73D350241F9FB3000B1B10 /* ColorPickerDelegate.swift */,
CFE7027B241A62ED00083903 /* ColorPickerInnerViewController.swift */,
569C25512427F57000022C60 /* ColorPickerTabViewController.swift */,
56C74666242F722A003ED00A /* ColorPickerSlider.swift */,
CFE7027E241B984600083903 /* ColorPickerSwatchViewController.swift */,
569C25572428346900022C60 /* ColorPickerMapSlider.swift */,
CFE70280241CBDE700083903 /* ColorPickerMapViewController.swift */,
CFE70288241D0E7300083903 /* ColorPickerWheelView.swift */,
CFE70282241CC88D00083903 /* ColorPickerSlidersViewController.swift */,
56C74668242F75E3003ED00A /* ColorPickerNumericSlider.swift */,
4E1C74162826C1F100227EC3 /* ColorPickerAccessibilityViewController.swift */,
4E1C741A2827829E00227EC3 /* AccessibilityComplianceLabel.swift */,
4E1C741C2827882600227EC3 /* AccessibilityContrastSelector.swift */,
CF73D32D241E49EE000B1B10 /* ColorWell.swift */,
CF7750BD252203630069CC57 /* DialogButton.swift */,
CF7750D52524615D0069CC57 /* SeparatorView.swift */,
4E2E6C05282BD5990089E4FB /* GradientView.swift */,
94A2368B252B5951002B5D0B /* UIColorAdditions.swift */,
4E1C741228266C5900227EC3 /* UIFontDescriptorAdditions.swift */,
4E1C741E2827B3C800227EC3 /* UIFloat.swift */,
4E1C741828276D5600227EC3 /* TextViewLabel.swift */,
4E1C74202827B8F800227EC3 /* NSBeep.swift */,
CF73D339241F9C23000B1B10 /* Info.plist */,
CFAFFC9024277CEE005AD4C1 /* Assets-ios12.xcassets */,
);
path = Alderis;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
CF73D331241F9C23000B1B10 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
CF73D33A241F9C23000B1B10 /* Alderis.h in Headers */,
CF775122252852460069CC57 /* AlderisSDKCompatibility.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
CF73D335241F9C23000B1B10 /* Alderis */ = {
isa = PBXNativeTarget;
buildConfigurationList = CF73D340241F9C23000B1B10 /* Build configuration list for PBXNativeTarget "Alderis" */;
buildPhases = (
CF73D331241F9C23000B1B10 /* Headers */,
CF73D332241F9C23000B1B10 /* Sources */,
CF73D333241F9C23000B1B10 /* Frameworks */,
CF73D334241F9C23000B1B10 /* Resources */,
CF77511225281F7E0069CC57 /* SwiftLint */,
);
buildRules = (
);
dependencies = (
);
name = Alderis;
productName = Alderis;
productReference = CF73D336241F9C23000B1B10 /* Alderis.framework */;
productType = "com.apple.product-type.framework";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
CF39D436222BC07C001EF57F /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1330;
ORGANIZATIONNAME = "HASHBANG Productions";
TargetAttributes = {
CF73D335241F9C23000B1B10 = {
CreatedOnToolsVersion = 11.3.1;
};
};
};
buildConfigurationList = CF39D439222BC07C001EF57F /* Build configuration list for PBXProject "Alderis" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = CF39D435222BC07C001EF57F;
productRefGroup = CF39D43F222BC07C001EF57F /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
CF73D335241F9C23000B1B10 /* Alderis */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
CF73D334241F9C23000B1B10 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
CFAFFC9124277CEE005AD4C1 /* Assets-ios12.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
CF77511225281F7E0069CC57 /* SwiftLint */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = SwiftLint;
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "export PATH=$PATH:/opt/homebrew/bin\nif which swiftlint >/dev/null; then\n\tswiftlint\nelse\n\techo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
CF73D332241F9C23000B1B10 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
CF73D34B241F9C31000B1B10 /* ColorPickerSwatchViewController.swift in Sources */,
CF7750BE252203630069CC57 /* DialogButton.swift in Sources */,
4E1C741928276D5600227EC3 /* TextViewLabel.swift in Sources */,
CF73D347241F9C31000B1B10 /* ColorPickerWheelView.swift in Sources */,
CF7750D62524615D0069CC57 /* SeparatorView.swift in Sources */,
CF73D34C241F9C4D000B1B10 /* Color.swift in Sources */,
94A2368C252B5951002B5D0B /* UIColorAdditions.swift in Sources */,
569C25582428346900022C60 /* ColorPickerMapSlider.swift in Sources */,
4E2E6C06282BD5990089E4FB /* GradientView.swift in Sources */,
CF73D344241F9C31000B1B10 /* ColorWell.swift in Sources */,
CF7750B72520D3B50069CC57 /* Assets.swift in Sources */,
CF73D348241F9C31000B1B10 /* ColorPickerInnerViewController.swift in Sources */,
56C74667242F722A003ED00A /* ColorPickerSlider.swift in Sources */,
4E1C74212827B8F800227EC3 /* NSBeep.swift in Sources */,
4E1C74172826C1F100227EC3 /* ColorPickerAccessibilityViewController.swift in Sources */,
4E1C741D2827882600227EC3 /* AccessibilityContrastSelector.swift in Sources */,
CF73D345241F9C31000B1B10 /* ColorPickerMapViewController.swift in Sources */,
CF79DA31251723C500F17BCB /* BottomSheetTransition.swift in Sources */,
4E1C741328266C5900227EC3 /* UIFontDescriptorAdditions.swift in Sources */,
CF73D34A241F9C31000B1B10 /* ColorPickerViewController.swift in Sources */,
CF7750CF252433680069CC57 /* ColorPickerConfiguration.swift in Sources */,
56C74669242F75E3003ED00A /* ColorPickerNumericSlider.swift in Sources */,
569C25522427F57000022C60 /* ColorPickerTabViewController.swift in Sources */,
4E1C741F2827B3C800227EC3 /* UIFloat.swift in Sources */,
CF73D351241F9FB3000B1B10 /* ColorPickerDelegate.swift in Sources */,
CF73D346241F9C31000B1B10 /* ColorPickerSlidersViewController.swift in Sources */,
4E1C741B2827829E00227EC3 /* AccessibilityComplianceLabel.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
CF39D452222BC07E001EF57F /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
};
name = Debug;
};
CF39D453222BC07E001EF57F /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
CF73D341241F9C23000B1B10 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
APPLICATION_EXTENSION_API_ONLY = YES;
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
CURRENT_PROJECT_VERSION = 3;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = Alderis/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MARKETING_VERSION = 1.2;
PRODUCT_BUNDLE_IDENTIFIER = ws.hbang.Alderis;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = NO;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Debug;
};
CF73D342241F9C23000B1B10 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
APPLICATION_EXTENSION_API_ONLY = YES;
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
CURRENT_PROJECT_VERSION = 3;
DEFINES_MODULE = YES;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
INFOPLIST_FILE = Alderis/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MARKETING_VERSION = 1.2;
PRODUCT_BUNDLE_IDENTIFIER = ws.hbang.Alderis;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = NO;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
CF39D439222BC07C001EF57F /* Build configuration list for PBXProject "Alderis" */ = {
isa = XCConfigurationList;
buildConfigurations = (
CF39D452222BC07E001EF57F /* Debug */,
CF39D453222BC07E001EF57F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
CF73D340241F9C23000B1B10 /* Build configuration list for PBXNativeTarget "Alderis" */ = {
isa = XCConfigurationList;
buildConfigurations = (
CF73D341241F9C23000B1B10 /* Debug */,
CF73D342241F9C23000B1B10 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = CF39D436222BC07C001EF57F /* Project object */;
}

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:Alderis Demo.xcodeproj">
</FileRef>
</Workspace>

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

View file

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1330"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "CF73D335241F9C23000B1B10"
BuildableName = "Alderis.framework"
BlueprintName = "Alderis"
ReferencedContainer = "container:Alderis.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "CF73D335241F9C23000B1B10"
BuildableName = "Alderis.framework"
BlueprintName = "Alderis"
ReferencedContainer = "container:Alderis.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View file

@ -0,0 +1,77 @@
//
// AccessibilityComplianceLabel.swift
// Alderis
//
// Created by Adam Demasi on 8/5/2022.
// Copyright © 2022 HASHBANG Productions. All rights reserved.
//
import UIKit
internal class AccessibilityComplianceLabel: UIView {
var text: String {
get { label.text! }
set { label.text = newValue }
}
var isCompliant = false {
didSet { updateState() }
}
private let tickImage = Assets.systemImage(named: "checkmark.circle.fill")
private let crossImage = Assets.systemImage(named: "xmark.circle.fill")
private var imageView: UIImageView!
private var label: UILabel!
override init(frame: CGRect) {
super.init(frame: frame)
let font = UIFont.systemFont(ofSize: UIFloat(16), weight: .medium)
imageView = UIImageView()
if #available(iOS 13, *) {
imageView.preferredSymbolConfiguration = UIImage.SymbolConfiguration(font: font, scale: .small)
}
label = UILabel()
label.font = font
let stackView = UIStackView(arrangedSubviews: [imageView, label])
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.alignment = .center
stackView.spacing = UIFloat(6)
addSubview(stackView)
NSLayoutConstraint.activate([
stackView.topAnchor.constraint(equalTo: self.topAnchor),
stackView.bottomAnchor.constraint(equalTo: self.bottomAnchor),
stackView.leadingAnchor.constraint(equalTo: self.leadingAnchor),
stackView.trailingAnchor.constraint(equalTo: self.trailingAnchor)
])
}
convenience init(text: String) {
self.init(frame: .zero)
self.text = text
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func updateState() {
let color = isCompliant ? Assets.green : Assets.red
tintColor = color
accessibilityLabel = "\(text): \(isCompliant ? "Compliant" : "Not compliant")"
imageView.image = isCompliant ? tickImage : crossImage
}
override func tintColorDidChange() {
super.tintColorDidChange()
label.textColor = tintColor
}
}

View file

@ -0,0 +1,91 @@
//
// AccessibilityContrastSelector.swift
// Alderis
//
// Created by Adam Demasi on 8/5/2022.
// Copyright © 2022 HASHBANG Productions. All rights reserved.
//
import UIKit
internal class AccessibilityContrastSelector: UIView {
enum Mode: Int, CaseIterable {
case color, black, white
var label: String {
switch self {
case .color: return "Color"
case .black: return "Black"
case .white: return "White"
}
}
func color(withColor color: Color) -> Color {
switch self {
case .color: return color
case .black: return .black
case .white: return .white
}
}
}
var text: String {
get { label.text! }
set { label.text = newValue }
}
var value: Mode = .white {
didSet {
if segmentedControl.selectedSegmentIndex != value.rawValue {
segmentedControl.selectedSegmentIndex = value.rawValue
handleChange?(value)
}
}
}
var handleChange: ((Mode) -> Void)?
private var label: UILabel!
private var segmentedControl: UISegmentedControl!
override init(frame: CGRect) {
super.init(frame: frame)
label = UILabel()
label.font = UIFont.systemFont(ofSize: UIFloat(16), weight: .medium)
segmentedControl = UISegmentedControl(items: Mode.allCases.map(\.label))
segmentedControl.addTarget(self, action: #selector(handleValueChanged), for: .valueChanged)
let stackView = UIStackView(arrangedSubviews: [label, UIView(), segmentedControl])
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.alignment = .center
stackView.distribution = .fill
stackView.spacing = UIFloat(5)
addSubview(stackView)
NSLayoutConstraint.activate([
stackView.topAnchor.constraint(equalTo: self.topAnchor),
stackView.bottomAnchor.constraint(equalTo: self.bottomAnchor),
stackView.leadingAnchor.constraint(equalTo: self.leadingAnchor),
stackView.trailingAnchor.constraint(equalTo: self.trailingAnchor)
])
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
convenience init(text: String, value: Mode) {
self.init(frame: .zero)
self.text = text
self.value = value
}
@objc private func handleValueChanged() {
value = Mode(rawValue: segmentedControl.selectedSegmentIndex)!
handleChange?(value)
}
}

View file

@ -0,0 +1,11 @@
//
// Alderis.h
// Alderis
//
// Created by Adam Demasi on 16/3/20.
// Copyright © 2020 HASHBANG Productions. All rights reserved.
//
@import UIKit;
#import "AlderisSDKCompatibility.h"

View file

@ -0,0 +1,21 @@
//
// AlderisSDKCompatibility.h
// Alderis
//
// Created by Adam Demasi on 3/10/20.
// Copyright © 2020 HASHBANG Productions. All rights reserved.
//
@import UIKit;
#ifndef __IPHONE_14_0
// Allows building with the iOS 13 SDK while retaining iOS 14 compatibility.
@interface UIControl ()
- (void)addAction:(UIAction *)action forControlEvents:(UIControlEvents)controlEvents NS_SWIFT_NAME(addAction(_:for:)) API_AVAILABLE(ios(14.0));
- (void)removeAction:(UIAction *)action forControlEvents:(UIControlEvents)controlEvents NS_SWIFT_NAME(removeAction(_:for:)) API_AVAILABLE(ios(14.0));
- (void)removeActionForIdentifier:(UIActionIdentifier)actionIdentifier forControlEvents:(UIControlEvents)controlEvents NS_SWIFT_NAME(removeAction(identifiedBy:for:)) API_AVAILABLE(ios(14.0));
@end
#endif

View file

@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View file

@ -0,0 +1,26 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "sun.max.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "sun.max@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "sun.max@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "template"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 661 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 942 B

View file

@ -0,0 +1,26 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "sun.min.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "sun.min@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "sun.min@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "template"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 606 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 909 B

View file

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,26 @@
{
"images" : [
{
"filename" : "checkmark.circle.fill.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "checkmark.circle.fill@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "checkmark.circle.fill@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 287 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 B

View file

@ -0,0 +1,26 @@
{
"images" : [
{
"filename" : "sparkles.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "sparkles@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "sparkles@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

View file

@ -0,0 +1,26 @@
{
"images" : [
{
"filename" : "xmark.circle.fill.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "xmark.circle.fill@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "xmark.circle.fill@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 B

View file

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View file

@ -0,0 +1,26 @@
{
"images" : [
{
"filename" : "circle.righthalf.fill.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "circle.righthalf.fill@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "circle.righthalf.fill@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 574 B

View file

@ -0,0 +1,26 @@
{
"images" : [
{
"filename" : "slider.horizontal.3.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "slider.horizontal.3@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "slider.horizontal.3@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 507 B

View file

@ -0,0 +1,26 @@
{
"images" : [
{
"filename" : "slider.horizontal.below.rectangle.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "slider.horizontal.below.rectangle@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "slider.horizontal.below.rectangle@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}

Some files were not shown because too many files have changed in this diff Show more