Команды yt-dlp и youtube-dl в Android Studio (код Java)

Я пытаюсь использовать команду yt-dlp в своем Java-коде для извлечения аудио из видео на YouTube. По сути, я пытаюсь разработать одно приложение для воспроизведения звука (для лучшего понимания работы с API), в котором я использую API Youtube. Я ищу любую музыку в своем приложении, и она показывает видео с YouTube в списке. На данный момент звук должен быть извлечен из видеороликов YouTube, поскольку я передаю команду в методе updateListView. Он должен возвращать URL-адрес (сохранение в модели), который будет использоваться в других файлах классов для воспроизведения mp3-файлов. Я пробую эту вещь уже больше 1 недели. Я пробовал несколько способов сделать это, но каждый раз получал только одну и ту же ошибку, изображение которой я прикрепил.

 private String getAudioUrl(String videoId)
    {
        File cacheDir = getCacheDir();
        File audioDir = new File(cacheDir, "audio");
        if (!audioDir.exists())
        {
            audioDir.mkdirs(); // Create the directory if it doesn't exist
        }
        try {
            ProcessBuilder processBuilder = new ProcessBuilder(
                    "~/.yt-dlp",
                    "-x",
                    "--audio-format", "mp3",
                    "-P", audioDir.getAbsolutePath() + "/%(title)s.%(ext)s",
                    "https://www.youtube.com/watch?v = " + videoId
            );
            Process process = processBuilder.start();
            BufferedReader read = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String audioUrl = read.readLine();
            read.close();
            Toast.makeText(MainActivity.this, "Playing!!!", Toast.LENGTH_SHORT).show();
            return audioUrl;
        } catch (IOException e)
        {
            e.printStackTrace();
            Toast.makeText(MainActivity.this, "Sorry, Error in playing audio!!!", Toast.LENGTH_SHORT).show();
        }
        return null;
    }

Я пытаюсь вызвать этот метод в методе ниже.

 private void updateSearchResultsList(List<SearchResult> results)
    {
        searchResults.clear();
        for (SearchResult result : results)
        {
            String videoTitle = result.getSnippet().getTitle();
            String videoImageUrl = result.getSnippet().getThumbnails().getDefault().getUrl();
            selectedVideoId = result.getId().getVideoId();

            //for testing
            // Log.d("Video ID", "Video ID: " + videoId);

            String audioUrl = getAudioUrl(selectedVideoId);
            YoutubeModel youtubeModel = new YoutubeModel(videoTitle, videoImageUrl, audioUrl);
            searchResults.add(youtubeModel);
        }
        adapter.notifyDataSetChanged();
    }//end of method

Ошибка :

java.io.IOException: Cannot run program "~/.yt-dlp": error=2, No such file or directory
2024-05-06 18:19:45.118 24092-24092 System.err              com.example.audio_player             W      at java.lang.ProcessBuilder.start(ProcessBuilder.java:1050)
2024-05-06 18:19:45.118 24092-24092 System.err              com.example.audio_player             W      at com.example.audio_player.Activity.MainActivity.getAudioUrl(MainActivity.java:196)
2024-05-06 18:19:45.118 24092-24092 System.err              com.example.audio_player             W      at com.example.audio_player.Activity.MainActivity.updateSearchResultsList(MainActivity.java:170)
2024-05-06 18:19:45.118 24092-24092 System.err              com.example.audio_player             W      at com.example.audio_player.Activity.MainActivity.access$400(MainActivity.java:31)
2024-05-06 18:19:45.118 24092-24092 System.err              com.example.audio_player             W      at com.example.audio_player.Activity.MainActivity$YouTubeSearchTask.onPostExecute(MainActivity.java:146)
2024-05-06 18:19:45.118 24092-24092 System.err              com.example.audio_player             W      at com.example.audio_player.Activity.MainActivity$YouTubeSearchTask.onPostExecute(MainActivity.java:121)
2024-05-06 18:19:45.118 24092-24092 System.err              com.example.audio_player             W      at android.os.AsyncTask.finish(AsyncTask.java:771)
2024-05-06 18:19:45.118 24092-24092 System.err              com.example.audio_player             W      at android.os.AsyncTask.-$$Nest$mfinish(Unknown Source:0)
2024-05-06 18:19:45.118 24092-24092 System.err              com.example.audio_player             W      at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:788)
2024-05-06 18:19:45.119 24092-24092 System.err              com.example.audio_player             W      at android.os.Handler.dispatchMessage(Handler.java:106)
2024-05-06 18:19:45.119 24092-24092 System.err              com.example.audio_player             W      at android.os.Looper.loopOnce(Looper.java:230)
2024-05-06 18:19:45.119 24092-24092 System.err              com.example.audio_player             W      at android.os.Looper.loop(Looper.java:319)
2024-05-06 18:19:45.119 24092-24092 System.err              com.example.audio_player             W      at android.app.ActivityThread.main(ActivityThread.java:8919)
2024-05-06 18:19:45.119 24092-24092 System.err              com.example.audio_player             W      at java.lang.reflect.Method.invoke(Native Method)
2024-05-06 18:19:45.119 24092-24092 System.err              com.example.audio_player             W      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578)
2024-05-06 18:19:45.119 24092-24092 System.err              com.example.audio_player             W      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)
2024-05-06 18:19:45.119 24092-24092 System.err              com.example.audio_player             W  Caused by: java.io.IOException: error=2, No such file or directory
2024-05-06 18:19:45.119 24092-24092 System.err              com.example.audio_player             W      at java.lang.UNIXProcess.forkAndExec(Native Method)
2024-05-06 18:19:45.119 24092-24092 System.err              com.example.audio_player             W      at java.lang.UNIXProcess.<init>(UNIXProcess.java:133)
2024-05-06 18:19:45.120 24092-24092 System.err              com.example.audio_player             W      at java.lang.ProcessImpl.start(ProcessImpl.java:141)
2024-05-06 18:19:45.120 24092-24092 System.err              com.example.audio_player             W      at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)

До сих пор я пробовал так много методов, которые я упомянул ниже:

  1. Установлен yt-dlp с pip и без pip. (то же самое для youtube-dl)
  2. Установите путь к yt-dlp в переменных среды. Я попробовал оба пути, путь Python по умолчанию и, создав новую папку, поместил файл (yt-dlp.exe) в эту папку, а затем установил путь.
  3. Я попытался определить, по какому пути движется мой код, и каким-то образом получил путь «data/user/0/com.example.audio_player/files». Я также скопировал сюда свой файл yt-dlp.exe, но ошибка все равно.
  4. Вручную установите файл в папке Assets в студии Android и используйте этот путь, но результата все равно нет.
  5. Я использовал оба способа вызова команды -> «~/.yt-dlp» и «yt-dlp».
  6. Каким-то образом я получил новую ошибку, когда использовал логику копирования файла из папки с ресурсами во внутренний каталог (который представляет собой data/user/0/com.example.audio_player/files), на этот раз я получил новую ошибку с надписью «Permission Denied». Я пытался дать разрешение путем кодирования и из манифеста, но все равно получил ошибку «Отказано в разрешении». Я установил разрешения INTERNET, READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE, а также некоторые новые разрешения, такие как READ_MEDIA_IMAGES и т. д.... до сих пор нет ответа.
  7. После поиска мы нашли два репозитория yt-dlp java и yt-dlp android. Я использовал оба репозитория, но он все еще работает. Вот эти репозитории: https://github.com/sapher/youtubedl-java и
    https://github.com/yausername/youtubedl-android.

Что еще я могу попытаться извлечь аудио из видео YouTube с помощью команды yt-dlp или есть ли другой способ сделать это???

попробуйте использовать абсолютный путь.

aled 07.05.2024 01:33

Я уже пытался установить путь с помощью метода setAbsolutePath, когда пытался запустить свой код с помощью одного из упомянутых репозиториев.

Amaan Sajina 08.05.2024 02:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
251
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После стольких дней серфинга в Интернете я наконец нашел решение для реализации этой функции. Что ж, согласно моим исследованиям, вы не можете напрямую добавлять код команды в Java-код вашей студии Android. Он будет продолжать выдавать ошибку: yt_dlp: нет такого каталога или каталога, поскольку код не может найти путь к yt_dlp, даже если вы добавите этот .exe-файл yt_dlp в свою папку assest. Простое решение: поскольку yt_dlp — это модуль Python, поэтому мы можем интегрировать наш код Python в нашу студию Android, что разрешено, и мы можем получить тот же результат, что и из командной строки. Для этого нам нужно добавить библиотеку Python в студию Android, которую вы можете получить здесь . Вы также можете получить этот код Python из моего репозитория здесь. Он находится в папке Python. Этот код вернет вам URL-адрес, извлеченный из аудио, который можно использовать в дальнейшем для воспроизведения аудиофайла. Тяжелая работа окупается!!!Продолжайте программировать!

Другие вопросы по теме