Skip to content

Commit 1896cb6

Browse files
committed
feat: open video from link in search box, conversion for all ARMv6 devices, proper error handling for inaccessible videos, chore: release 0.3.0
1 parent 50ea6c0 commit 1896cb6

22 files changed

Lines changed: 776 additions & 332 deletions

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# notPipe
22
**English** / [русский](README.ru.md)
33

4-
A working YouTube client for **Android 1.5+** utilizing multiple backend APIs. Made with ❤ and longevity in mind. Instead of depending on a single instance that could break tomorrow, the app leverages multiple instances concurrently for maximum reliability.
4+
A working YouTube client for **Android 1.5+** utilizing multiple backend APIs. Made with ❤ and longevity in mind. Instead of depending on a single instance that might suddenly fail, the app leverages multiple instances concurrently for maximum reliability.
55
* **Telegram channel for updates**: [@AppDataApps](https://t.me/AppDataApps)
66
* Join our **[Retro Android Group](https://t.me/retroandroidgroup)** on Telegram!
77

@@ -26,12 +26,12 @@ List of supported APIs:
2626

2727
## Features
2828
> [!NOTE]
29-
> Due to various limitations, the app does not connect to YouTube directly. Instead it connects to various instances of Invidious, yt2009 and YtAPILegacy. This can also bypass network restrictions of YouTube. See ["Why and how"](#why-and-how) for more information.
29+
> This app does not connect to YouTube directly, which can bypass various network restrictions. See ["Why and how"](#why-and-how) for more information.
3030
* Popular, search
3131
* Videos, related videos, comments
3232
* Video playback in 360p/480p/720p/1080p
3333
* Channels
34-
* Video conversion for devices that do not support H.264
34+
* Video conversion for devices that do not support H.264 to MPEG-4 Visual and H.263 codecs
3535
* Automatic updates of the list of instances from a URL
3636
* Tablet UI
3737
### TODO
@@ -86,7 +86,7 @@ It is recommended to use AS while contributing; however, you may use another IDE
8686
Although not used as inspiration or a codebase, these other attempts of implementing YouTube deserve acknowledgment, as they led to the idea of this project.
8787
* [Mini YouTube by monobogdan](https://github.com/monobogdan/selfeco) — client for Android 2.0+ utilizing a hardcoded Invidious instance with requests proxied to monobogdan's Russian server. The proxy server is dead and considering it has a single point of failure, it's not worth it to compile the project with a new instance even with the proxy removed.
8888
* [ReOldTube by YMP Yuri](https://github.com/YMP-CO/ReOld-Tube) — client for Android 3.0+ utilizing Invidious. While it can be configured in settings to be used today, it has numerous bugs *(and is vibecoded)*.
89-
* [YT-Legacy-Eclair by MoreVista](https://github.com/MoreVista/YT-Legacy-Eclair) — simple client for Android 2.1+ utilizing Invidious. The instance can be changed in settings.
89+
* [YT-Legacy-Eclair by MoreVista](https://github.com/MoreVista/YT-Legacy-Eclair) — simple client for Android 2.1+ utilizing Invidious. The single instance can be changed in settings.
9090
## License
9191
The **notPipe** project is licensed under the Do What The Fuck You Want To Public License, Version 2. See [LICENSE](LICENSE) for details. *If you want, you may credit me in the README of your project.*
9292

README.ru.md

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,46 @@
11
# notPipe
22
[English](README.md) / **русский**
33

4-
Рабочий клиент YouTube для **Android 1.5+**, использующий API [Invidious](https://invidious.io), [yt2009](https://github.com/ftde0/yt2009) и [YtAPILegacy](http://yt.modyleprojects.ru). Сделан с ❤ и расчётом на долговечность. Вместо того, чтобы подключаться к одному определённому инстансу, приложение использует множество инстансов для надёжности.
4+
Рабочий клиент YouTube для **Android 1.5+**, использующий несколько серверных API. Создан с ❤ и расчётом на долговечность. Вместо того чтобы зависеть от одного инстанса, который может внезапно перестать работать, приложение параллельно использует сразу несколько для максимальной надежности.
55
* **Telegram-канал по проекту:** [@AppDataApps](https://t.me/AppDataApps)
66
* Заходите в наш Telegram-чат **[Retro Android](https://t.me/retroandroidgroup)**!
77

88
![notPipe](img/logo.png "Рабочий Ютуб для старых андроидов")
99

1010
<img src="img/scr1.png" alt="Screenshot" width="200"/> <img src="img/scr2.png" alt="Screenshot" width="200"/> <img src="img/scr3.png" alt="Screenshot" width="200"/> <img src="img/scr4.png" alt="Screenshot" width="200"/> <img src="img/scr5.png" alt="Screenshot" width="200"/> <img src="img/scr6.png" alt="Screenshot" width="200"/>
1111

12+
Список поддерживаемых API:
13+
* [Invidious](https://docs.invidious.io/api/) (метаданные, 360p)
14+
* [yt2009](https://github.com/ftde0/yt2009) (все качества, конвертация, каналы)
15+
* [Piped](https://docs.piped.video/docs/api-documentation/) (метаданные, 360p)
16+
* [YtAPILegacy](https://github.com/ZendoMusic/yt-api-legacy) (метаданные, все качества, конвертация)
17+
1218
## 📥 Скачать
1319
* [GitHub Releases](https://github.com/gohoski/notPipe/releases)
1420
* [OldMarket](http://oldmarket.store/app.php?id=536)
1521
* [Моя Интернет Страна](http://myintcountry.ru/index.php?board=android&action=display&num=1)
1622
* Telegram (ссылка в начале README)
1723
* [4PDA](https://4pda.to/forum/index.php?showtopic=1119054)
1824
* [Appteka](https://appteka.store/search?q=notPipe)
19-
* [NeonApps](http://neonapps.ru/app.php?id=456)
25+
* [NeonApps](http://neonapps.ru/?app=456)
2026
## Возможности
2127
> [!NOTE]
22-
> Из-за различных ограничений приложение не подключается к YouTube напрямую. Вместо этого оно подключается к различным инстансам Invidious, yt2009 и YtAPILegacy. Это также обходит ограничения YouTube, поскольку весь трафик проксируется. См. «[Зачем и как это работает](#зачем-и-как-это-работает)».
28+
> Приложение не подключается к YouTube напрямую, поэтому это обходит различные сетевые ограничения. См. «[Зачем и как это работает](#зачем-и-как-это-работает)».
2329
* Популярное, поиск
2430
* Видео, похожие видео, комментарии
25-
* Воспроизведение видео
31+
* Воспроизведение видео в 360p/480p/720p/1080p
2632
* Каналы
27-
* Конвертация видео для устройств без поддержки H.264
33+
* Конвертация видео для устройств без поддержки H.264 в кодеки MPEG-4 Visual и H.263
2834
* Автоматическое обновление списка инстансов с ссылки
2935
* Планшетный интерфейс
3036
### TODO
31-
* Плейлисты
32-
* Авторизация через YTFixer/yt2009 (рекомендации, подписки, история и т. д.)
3337
* Скачивание видео
34-
* Скачивание видео как музыку
38+
* Скачивание аудио
39+
* Авторизация в YouTube-аккаунт через YTFixer/yt2009 (рекомендации, подписки, история и т. д.)
40+
* Плейлисты
41+
* Локальный аккаунт для подписок (как в NewPipe)
3542

36-
## Фиксим проблемы на Android ≤2.3
43+
## Исправляем проблемы на Android ≤2.3
3744
*(видео лагают или вообще не воспроизводятся)*
3845

3946
Если видео не воспроизводятся, сначала попробуйте типичную диагностику:
@@ -46,7 +53,7 @@
4653

4754
## Зачем и как это работает
4855
Существующие способы смотреть YouTube на старых Android-устройствах страдают от двух фатальных недостатков — неудобства использования и неспособности обходить текущие защиты YT против ботов. Актуальные на сегодня способы имеют следующие проблемы:
49-
* **Единая точка отказа.** Текущие *(и прошлые)* способы смотреть YouTube полагаются на один конкретный инстанс API (сервер). Как только такой инстанс получает заметный объём трафика, YouTube автоматически банит его IP-адрес. Кроме того, один сервер может быть сильно перегружен, из-за чего им становится невозможно пользоваться.
56+
* **Единая точка отказа.** Предыдущие способы смотреть YouTube полагаются на один конкретный инстанс API (сервер). Как только такой инстанс получает заметный объём трафика, YouTube автоматически банит его IP-адрес. Кроме того, один сервер может быть сильно перегружен, из-за чего им становится невозможно пользоваться.
5057
* **Плохая удобность использования.** Веб-обёрткам вроде S60Tube не хватает ощущения нативного приложения, плюс они требуют постоянного переключения между браузером и видеоплеером. Пропатченные APK-файлы под сервер yt2009 требуют нудного ручного изменения под каждый конкретный инстанс. К тому же, они часто страдают от сильной нагрузки при кодировании видео на стороне сервера, что приводит к бесконечной загрузке. Да и старый мобильный дизайн YouTube не всегда удобен. Всё ощущается очень костыльным.
5158

5259
Этот проект был создан с нуля, чтобы решить именно эти проблемы. Вместо того чтобы зависеть от единой точки отказа, этот клиент **использует несколько API и инстансов** одновременно, случайным образом выбирая новый сервер для каждого действия. Такой децентрализованный подход даёт критически важные преимущества:
@@ -56,12 +63,8 @@
5663
4. **Никакой единой точки отказа.** Поскольку именно так умерли предыдущие клиенты YouTube, здесь всё децентрализовано и открыто для вклада любого желающего.
5764
5. **Автоматическое обновление инстансов.** Список инстансов обновляется автоматически и по умолчанию загружается с http://144.31.189.129/notPipe.json, что требует от пользователя минимум действий.
5865

59-
## Как помочь проекту
60-
Спасибо, что хотите внести вклад! Любая помощь важна — от отчёта о баге до перевода одной фразы.
61-
### Сообщить о баге
62-
**Вам во вкладку «[Issues](https://github.com/gohoski/numAi/issues)» на GitHub!** Не забудьте указать, на какой версии Android и архитектуре (ARMv5/v6/v7/др.) вы столкнулись с проблемой.
63-
### Помочь с переводом
64-
Проект говорит на вашем языке? А если нет — помогите ему заговорить! Переводы делают приложение доступным и удобным для всех людей. Переведите файл [strings.xml](https://github.com/gohoski/notPipe/blob/main/app/src/main/res/values-ru/strings.xml), учитывая правила [Android string resources](https://developer.android.com/guide/topics/resources/string-resource), и предоставьте его. Вы также можете перевести README.md.
66+
## Сообщить о баге
67+
**Вам во вкладку «[Issues](https://github.com/gohoski/notPipe/issues)» на GitHub!** Не забудьте указать, на какой версии Android и архитектуре (ARMv5/v6/v7/др.) вы столкнулись с проблемой.
6568

6669
## Сборка
6770
Проект разрабатывается в следующей среде:
@@ -77,11 +80,12 @@
7780
## Благодарности
7881
* [How-to-develop-and-backport-for-Android-2.1-in-2020](https://github.com/Mik-el/How-to-develop-and-backport-for-Android-2.1-in-2020) — шаблон проекта от Микеле
7982
* [NNJSON](https://github.com/shinovon/NNJSON) — библиотека от nnproject
80-
* **Отдельное спасибо всем контрибьюторам [Invidious](https://github.com/iv-org/invidious/graphs/contributors), [yt2009](https://github.com/ftde0/yt2009/graphs/contributors) и [YtAPILegacy](https://github.com/ZendoMusic/yt-api-legacy/graphs/contributors) за создание этих потрясающих API**
83+
* **Отдельное спасибо всем контрибьюторам [Invidious](https://github.com/iv-org/invidious/graphs/contributors?all=1), [yt2009](https://github.com/ftde0/yt2009/graphs/contributors?all=1), [Piped](https://github.com/TeamPiped/Piped-Backend/graphs/contributors?all=1) и [YtAPILegacy](https://github.com/ZendoMusic/yt-api-legacy/graphs/contributors?all=1) за создание этих потрясающих API**
8184
### Предыдущие клиенты YouTube
8285
Хотя они не использовались ни как источник вдохновения, ни как кодовая база, эти приложения заслуживают упоминания, поскольку именно они навели на идею создания этого проекта.
8386
* [Mini YouTube от monobogdan](https://github.com/monobogdan/selfeco) — клиент для Android 2.0+, использующий захардкоженный инстанс Invidious с проксированием запросов через российский сервер monobogdan'а. Сейчас прокси-сервер мёртв, а учитывая, что здесь присутствует «единая точка отказа», компилировать проект с новым инстансом, даже убрав прокси, не имеет смысла.
84-
* [ReOldTube от YMP Yuri](https://github.com/YMP-CO/ReOld-Tube) — клиент для Android 3.0+, использующий Invidious. Несмотря на то, что в настройках его можно сконфигурировать для работы и сегодня, в нём полно багов *(да и написан он «на вайбах» / vibecoded)*.
87+
* [ReOldTube от YMP Yuri](https://github.com/YMP-CO/ReOld-Tube) — клиент для Android 3.0+, использующий Invidious. Хоть и в настройках его можно сконфигурировать для работы и сегодня, в нём полно багов *(да и написан он «на вайбах» / vibecoded)*.
88+
* [YT-Legacy-Eclair от MoreVista](https://github.com/MoreVista/YT-Legacy-Eclair) — простой клиент для Android 2.1+, использующий Invidious. Единичный инстанс можно сменить в настройках.
8589
## Лицензия
8690
Проект **notPipe** распространяется под лицензией Do What The Fuck You Want To Public License, версия 2. Подробности см. в файле [LICENSE](LICENSE). *При желании можете указать меня в README своего проекта.*
8791

app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ android {
99
//noinspection OldTargetApi
1010
targetSdkVersion 25
1111
versionCode 5
12-
versionName "0.3.0dev"
12+
versionName "0.3.0"
1313
setProperty("archivesBaseName", "notPipe-$versionName") //e.g. notPipe-0.1.0-release.apk
1414
}
1515
buildTypes {

app/src/main/java/io/github/gohoski/notpipe/ChannelActivity.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import android.widget.TabHost;
2323
import android.widget.TabWidget;
2424
import android.widget.TextView;
25+
import android.widget.Toast;
2526

2627
import java.text.NumberFormat;
2728
import java.util.ArrayList;
@@ -30,6 +31,7 @@
3031
import io.github.gohoski.notpipe.api.ChannelApi;
3132
import io.github.gohoski.notpipe.api.Manager;
3233
import io.github.gohoski.notpipe.api.Metadata;
34+
import io.github.gohoski.notpipe.api.ContentUnavailableException;
3335
import io.github.gohoski.notpipe.data.Channel;
3436
import io.github.gohoski.notpipe.data.VideoInfo;
3537
import io.github.gohoski.notpipe.ui.VideoAdapter;
@@ -298,13 +300,19 @@ protected void onDestroy() {
298300
}
299301

300302
private class LoadChannelTask extends AsyncTask<String, Void, Channel> {
303+
private boolean contentUnavailable;
304+
301305
@Override
302306
protected Channel doInBackground(String... strings) {
303307
try {
304308
if (isCancelled()) return null;
305309
api = Manager.getInstance().getMetadata();
306310
channelApi = Manager.getInstance().getChannelApi();
307311
return api.getChannel(strings[0]);
312+
} catch (ContentUnavailableException e) {
313+
e.printStackTrace();
314+
contentUnavailable = true;
315+
return null;
308316
} catch (Exception e) {
309317
e.printStackTrace();
310318
return null;
@@ -316,6 +324,9 @@ protected void onPostExecute(final Channel fetched) {
316324
if (isCancelled() || isDestroyedFlag) return;
317325
if (fetched == null) {
318326
findViewById(R.id.loading).setVisibility(View.GONE);
327+
if (contentUnavailable) {
328+
Toast.makeText(context, R.string.content_unavailable, Toast.LENGTH_SHORT).show();
329+
}
319330
return;
320331
}
321332
channel = fetched;

0 commit comments

Comments
 (0)