Часть функционала MediaPlayerRenderer | Exp Ready | Для всех аудио-потоков

Начинающий
Статус
Оффлайн
Регистрация
6 Дек 2023
Сообщения
440
Реакции[?]
2
Поинты[?]
2K
Забаненный
Статус
Оффлайн
Регистрация
19 Фев 2025
Сообщения
9
Реакции[?]
0
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Доброго времени суток читающие, ща покажу как сделать MediaPlayer который будет получать любой играющий поток будь то YouTube, Telegram, или даже браузер, и будет рендерить табличку с автором, названием и продолжительносью (фото обложки трека можете доделать сами)

И так начнем, для создания такого чуда нам понадобиться библиотека mediaplayer-info я прикрепляю её ниже:
Нам нужно засунуть её в папку lib или Libraries в нашей пасточке, и после чего нажать Shift+Ctrl+LAlt+S одновременно, далее выбрать в колонке "Artifacts" тобишь где мы собственно говоря билдим наш читикс, и жмем на Посмотреть вложение 300802 для добавления нужной нам библиотеки, далее выбираем тут Extracted Directory: Посмотреть вложение 300803 и после ищем Mediaplayer-info (наша библиотека которая нужна для работы таблички), после добавления создаем класс MediaPlayerRenderer (импорты поставьте сами плиз:


Код:
@FieldDefaults(level = AccessLevel.PRIVATE)
@RequiredArgsConstructor
public class MediaplayerRenderer implements ElementRenderer {

    final Minecraft mc = Minecraft.getInstance();
    IMediaSession session = null;
    final Dragging drag;
    String title;
    String artist;
    int duration;
    int position;
    private final ExecutorService executorService = Executors.newSingleThreadExecutor();
    private static final List<String> ownerPriority = List.of("SPOTIFY", "CHROME");
    public float animationStep;
    float ez;

    private boolean isMediaPlayerInfoEnabled;

    @Override
    public void render(EventDisplay eventDisplay) {
        if (Expensive.getInstance().getFunctionRegistry() != null) {
            isMediaPlayerInfoEnabled = Expensive.getInstance().getFunctionRegistry().getHud().isState() && HUD.elements.getValueByName("Медиаплеер (мощные пк)").get();
        }
        MatrixStack ms = eventDisplay.getMatrixStack();
        float posX = drag.getX();
        float posY = drag.getY();
        float headSize = 0;
        float spacing = 5;
        float width = 110;
        float height = 59 / 2f;
        drag.setWidth(width);
        drag.setHeight(height);
        GlStateManager.pushMatrix();
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        drawStyledRect(posX, posY, width, height, 6, 255);
        if (isMediaPlayerInfoEnabled) {
            executorService.submit(() -> {
                try {
                    List<IMediaSession> sessions = MediaPlayerInfo.Instance != null ? MediaPlayerInfo.Instance.getMediaSessions() : null;
                    if (sessions == null || sessions.isEmpty()) {
                        //throw new IllegalStateException("Не удалось получить сессии.");
                    }
                    sessions = sessions.stream()
                            .sorted((s1, s2) -> Integer.compare(getOwnerPriorityIndex(s1), getOwnerPriorityIndex(s2)))
                            .collect(Collectors.toList());
                    IMediaSession mediaSession = sessions.stream()
                            .filter(s -> s.getMedia() != null && (!s.getMedia().getArtist().isEmpty() || !s.getMedia().getTitle().isEmpty()))
                            .findFirst()
                            .orElse(null);
                    if (mediaSession != null && mediaSession.getMedia() != null) {
                        MediaInfo media = mediaSession.getMedia();
                        title = media.getTitle();
                        artist = media.getArtist();
                        duration = (int) media.getDuration();
                        position = (int) media.getPosition();
                    } else {
                        title = "No track";
                        artist = "Unknown artist";
                        duration = 0;
                        position = 0;
                    }
                } catch (Throwable e) {
                    title = "loading...";
                    artist = "loading...";
                    duration = 0;
                    position = 0;
                    e.printStackTrace();
                }
            });
        } else {
            title = "Media Info Disabled";
            artist = "N/A";
            duration = 0;
            position = 0;
        }

        String displayTitle = title != null ? (title.length() > 22 ? title.substring(0, 22) + "..." : title) : "No track";
        String displayArtist = artist != null ? (artist.length() > 18 ? artist.substring(0, 18) + "..." : artist) : "Unknown artist";
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayTitle, posX + spacing + spacing, posY + spacing + 1, -1, 7);
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayArtist, posX + spacing + spacing, posY + spacing + spacing + spacing - 1, ColorUtils.rgb(200, 200, 200), 7);
        if (duration > 0) {
            float adjustedWidth = width + 20;
            float progress = (float) position / duration;
            ez = 0;
            animationStep = MathUtil.fast(animationStep, progress, 6);
            Vector4i vector4i = new Vector4i(style.getFirstColor().getRGB(), style.getFirstColor().getRGB(), style.getSecondColor().getRGB(), style.getSecondColor().getRGB());
            Vector4i newvec = new Vector4i(ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42), 1f, new Vector4f(2,2,2,2), ColorUtils.rgb(32, 32, 32));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42) * animationStep, 1f, new Vector4f(2,2,2,2), newvec);
        }
        GlStateManager.popMatrix();
    }

    private void drawStyledRect(float x, float y, float width, float height, float radius, int alpha) {
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        DisplayUtils.drawRoundedRect(x, y, width + ez, height, radius, ColorUtils.rgba(21, 21, 21, alpha));
    }

    private int getOwnerPriorityIndex(IMediaSession session) {
        for (int i = 0; i < ownerPriority.size(); i++) {
            if (session.getOwner().toUpperCase().contains(ownerPriority.get(i))) {
                return i;
            }
        }
        return ownerPriority.size();
    }

    private String formatDuration(int duration) {
        int minutes = duration / 60;
        int seconds = duration % 60;
        return String.format("%02d:%02d", minutes, seconds);
    }
}
и уже регестрируем этот MediaPlayerRenderer в нашем классе HUD:

1 добавляем в элементы рендера
2 final MediaplayerRenderer mediaplayerRenderer; (ставим в любое место вне блоков ивентов)
3 в EventDisplay: if (elements.getValueByName("Медиаплеер").get()) mediaplayerRenderer.render(e);
4 в HUD создаем Dragging для него:
Dragging player = Expensive.getInstance().createDrag(this, "Player", 201, 5);
mediaplayerRenderer = new MediaplayerRenderer(player);


Всё радуемся рабочему плееру (Внимание!!! Слил, потому что довольно таки часто крашит, спустя 1 - 3 часа игры начнет тупо вылетать игра что дефаеться перезагрузкой пк но все равно медиаплеер стоящий)

Библиотека mediaplayerinfo:
а также прикрепляю SS:

Посмотреть вложение 300805
MediaPlayerLib JAR - VirusTotal ->
Пожалуйста, авторизуйтесь для просмотра ссылки.

Всех благ ;)
ну ты бы хотя бы исходники оставил не? не думал что тут люди и с линуксом сидят? и с маком? а так смысл взял опен сурс либку и взял залил причем я уверен там были исходники от темы 0 смысла
 
Начинающий
Статус
Онлайн
Регистрация
28 Июл 2020
Сообщения
189
Реакции[?]
10
Поинты[?]
7K
просто ты криворукий, а на котлине все более чем прекрасно работает
Ну да действительно, я криворукий, нативка написана криво и спустя время тебе тупо в моменте отдаст огромный массив данных который котлин не обработает и крашнет нахуй)
 
Начинающий
Статус
Оффлайн
Регистрация
5 Ноя 2022
Сообщения
86
Реакции[?]
0
Поинты[?]
0
Доброго времени суток читающие, ща покажу как сделать MediaPlayer который будет получать любой играющий поток будь то YouTube, Telegram, или даже браузер, и будет рендерить табличку с автором, названием и продолжительносью (фото обложки трека можете доделать сами)

И так начнем, для создания такого чуда нам понадобиться библиотека mediaplayer-info я прикрепляю её ниже:
Нам нужно засунуть её в папку lib или Libraries в нашей пасточке, и после чего нажать Shift+Ctrl+LAlt+S одновременно, далее выбрать в колонке "Artifacts" тобишь где мы собственно говоря билдим наш читикс, и жмем на Посмотреть вложение 300802 для добавления нужной нам библиотеки, далее выбираем тут Extracted Directory: Посмотреть вложение 300803 и после ищем Mediaplayer-info (наша библиотека которая нужна для работы таблички), после добавления создаем класс MediaPlayerRenderer (импорты поставьте сами плиз:


Код:
@FieldDefaults(level = AccessLevel.PRIVATE)
@RequiredArgsConstructor
public class MediaplayerRenderer implements ElementRenderer {

    final Minecraft mc = Minecraft.getInstance();
    IMediaSession session = null;
    final Dragging drag;
    String title;
    String artist;
    int duration;
    int position;
    private final ExecutorService executorService = Executors.newSingleThreadExecutor();
    private static final List<String> ownerPriority = List.of("SPOTIFY", "CHROME");
    public float animationStep;
    float ez;

    private boolean isMediaPlayerInfoEnabled;

    @Override
    public void render(EventDisplay eventDisplay) {
        if (Expensive.getInstance().getFunctionRegistry() != null) {
            isMediaPlayerInfoEnabled = Expensive.getInstance().getFunctionRegistry().getHud().isState() && HUD.elements.getValueByName("Медиаплеер (мощные пк)").get();
        }
        MatrixStack ms = eventDisplay.getMatrixStack();
        float posX = drag.getX();
        float posY = drag.getY();
        float headSize = 0;
        float spacing = 5;
        float width = 110;
        float height = 59 / 2f;
        drag.setWidth(width);
        drag.setHeight(height);
        GlStateManager.pushMatrix();
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        drawStyledRect(posX, posY, width, height, 6, 255);
        if (isMediaPlayerInfoEnabled) {
            executorService.submit(() -> {
                try {
                    List<IMediaSession> sessions = MediaPlayerInfo.Instance != null ? MediaPlayerInfo.Instance.getMediaSessions() : null;
                    if (sessions == null || sessions.isEmpty()) {
                        //throw new IllegalStateException("Не удалось получить сессии.");
                    }
                    sessions = sessions.stream()
                            .sorted((s1, s2) -> Integer.compare(getOwnerPriorityIndex(s1), getOwnerPriorityIndex(s2)))
                            .collect(Collectors.toList());
                    IMediaSession mediaSession = sessions.stream()
                            .filter(s -> s.getMedia() != null && (!s.getMedia().getArtist().isEmpty() || !s.getMedia().getTitle().isEmpty()))
                            .findFirst()
                            .orElse(null);
                    if (mediaSession != null && mediaSession.getMedia() != null) {
                        MediaInfo media = mediaSession.getMedia();
                        title = media.getTitle();
                        artist = media.getArtist();
                        duration = (int) media.getDuration();
                        position = (int) media.getPosition();
                    } else {
                        title = "No track";
                        artist = "Unknown artist";
                        duration = 0;
                        position = 0;
                    }
                } catch (Throwable e) {
                    title = "loading...";
                    artist = "loading...";
                    duration = 0;
                    position = 0;
                    e.printStackTrace();
                }
            });
        } else {
            title = "Media Info Disabled";
            artist = "N/A";
            duration = 0;
            position = 0;
        }

        String displayTitle = title != null ? (title.length() > 22 ? title.substring(0, 22) + "..." : title) : "No track";
        String displayArtist = artist != null ? (artist.length() > 18 ? artist.substring(0, 18) + "..." : artist) : "Unknown artist";
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayTitle, posX + spacing + spacing, posY + spacing + 1, -1, 7);
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayArtist, posX + spacing + spacing, posY + spacing + spacing + spacing - 1, ColorUtils.rgb(200, 200, 200), 7);
        if (duration > 0) {
            float adjustedWidth = width + 20;
            float progress = (float) position / duration;
            ez = 0;
            animationStep = MathUtil.fast(animationStep, progress, 6);
            Vector4i vector4i = new Vector4i(style.getFirstColor().getRGB(), style.getFirstColor().getRGB(), style.getSecondColor().getRGB(), style.getSecondColor().getRGB());
            Vector4i newvec = new Vector4i(ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42), 1f, new Vector4f(2,2,2,2), ColorUtils.rgb(32, 32, 32));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42) * animationStep, 1f, new Vector4f(2,2,2,2), newvec);
        }
        GlStateManager.popMatrix();
    }

    private void drawStyledRect(float x, float y, float width, float height, float radius, int alpha) {
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        DisplayUtils.drawRoundedRect(x, y, width + ez, height, radius, ColorUtils.rgba(21, 21, 21, alpha));
    }

    private int getOwnerPriorityIndex(IMediaSession session) {
        for (int i = 0; i < ownerPriority.size(); i++) {
            if (session.getOwner().toUpperCase().contains(ownerPriority.get(i))) {
                return i;
            }
        }
        return ownerPriority.size();
    }

    private String formatDuration(int duration) {
        int minutes = duration / 60;
        int seconds = duration % 60;
        return String.format("%02d:%02d", minutes, seconds);
    }
}
и уже регестрируем этот MediaPlayerRenderer в нашем классе HUD:

1 добавляем в элементы рендера
2 final MediaplayerRenderer mediaplayerRenderer; (ставим в любое место вне блоков ивентов)
3 в EventDisplay: if (elements.getValueByName("Медиаплеер").get()) mediaplayerRenderer.render(e);
4 в HUD создаем Dragging для него:
Dragging player = Expensive.getInstance().createDrag(this, "Player", 201, 5);
mediaplayerRenderer = new MediaplayerRenderer(player);


Всё радуемся рабочему плееру (Внимание!!! Слил, потому что довольно таки часто крашит, спустя 1 - 3 часа игры начнет тупо вылетать игра что дефаеться перезагрузкой пк но все равно медиаплеер стоящий)

Библиотека mediaplayerinfo:
а также прикрепляю SS:

Посмотреть вложение 300805
MediaPlayerLib JAR - VirusTotal ->
Пожалуйста, авторизуйтесь для просмотра ссылки.

Всех благ ;)
у тебя каждый раз запускаешь executorService.submit() в каждом вызове render, -фпс, можно сделать что бы вызывалось раз 1 сек
 
Начинающий
Статус
Оффлайн
Регистрация
21 Ноя 2024
Сообщения
74
Реакции[?]
0
Поинты[?]
0
Доброго времени суток читающие, ща покажу как сделать MediaPlayer который будет получать любой играющий поток будь то YouTube, Telegram, или даже браузер, и будет рендерить табличку с автором, названием и продолжительносью (фото обложки трека можете доделать сами)

И так начнем, для создания такого чуда нам понадобиться библиотека mediaplayer-info я прикрепляю её ниже:
Нам нужно засунуть её в папку lib или Libraries в нашей пасточке, и после чего нажать Shift+Ctrl+LAlt+S одновременно, далее выбрать в колонке "Artifacts" тобишь где мы собственно говоря билдим наш читикс, и жмем на Посмотреть вложение 300802 для добавления нужной нам библиотеки, далее выбираем тут Extracted Directory: Посмотреть вложение 300803 и после ищем Mediaplayer-info (наша библиотека которая нужна для работы таблички), после добавления создаем класс MediaPlayerRenderer (импорты поставьте сами плиз:


Код:
@FieldDefaults(level = AccessLevel.PRIVATE)
@RequiredArgsConstructor
public class MediaplayerRenderer implements ElementRenderer {

    final Minecraft mc = Minecraft.getInstance();
    IMediaSession session = null;
    final Dragging drag;
    String title;
    String artist;
    int duration;
    int position;
    private final ExecutorService executorService = Executors.newSingleThreadExecutor();
    private static final List<String> ownerPriority = List.of("SPOTIFY", "CHROME");
    public float animationStep;
    float ez;

    private boolean isMediaPlayerInfoEnabled;

    @Override
    public void render(EventDisplay eventDisplay) {
        if (Expensive.getInstance().getFunctionRegistry() != null) {
            isMediaPlayerInfoEnabled = Expensive.getInstance().getFunctionRegistry().getHud().isState() && HUD.elements.getValueByName("Медиаплеер (мощные пк)").get();
        }
        MatrixStack ms = eventDisplay.getMatrixStack();
        float posX = drag.getX();
        float posY = drag.getY();
        float headSize = 0;
        float spacing = 5;
        float width = 110;
        float height = 59 / 2f;
        drag.setWidth(width);
        drag.setHeight(height);
        GlStateManager.pushMatrix();
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        drawStyledRect(posX, posY, width, height, 6, 255);
        if (isMediaPlayerInfoEnabled) {
            executorService.submit(() -> {
                try {
                    List<IMediaSession> sessions = MediaPlayerInfo.Instance != null ? MediaPlayerInfo.Instance.getMediaSessions() : null;
                    if (sessions == null || sessions.isEmpty()) {
                        //throw new IllegalStateException("Не удалось получить сессии.");
                    }
                    sessions = sessions.stream()
                            .sorted((s1, s2) -> Integer.compare(getOwnerPriorityIndex(s1), getOwnerPriorityIndex(s2)))
                            .collect(Collectors.toList());
                    IMediaSession mediaSession = sessions.stream()
                            .filter(s -> s.getMedia() != null && (!s.getMedia().getArtist().isEmpty() || !s.getMedia().getTitle().isEmpty()))
                            .findFirst()
                            .orElse(null);
                    if (mediaSession != null && mediaSession.getMedia() != null) {
                        MediaInfo media = mediaSession.getMedia();
                        title = media.getTitle();
                        artist = media.getArtist();
                        duration = (int) media.getDuration();
                        position = (int) media.getPosition();
                    } else {
                        title = "No track";
                        artist = "Unknown artist";
                        duration = 0;
                        position = 0;
                    }
                } catch (Throwable e) {
                    title = "loading...";
                    artist = "loading...";
                    duration = 0;
                    position = 0;
                    e.printStackTrace();
                }
            });
        } else {
            title = "Media Info Disabled";
            artist = "N/A";
            duration = 0;
            position = 0;
        }

        String displayTitle = title != null ? (title.length() > 22 ? title.substring(0, 22) + "..." : title) : "No track";
        String displayArtist = artist != null ? (artist.length() > 18 ? artist.substring(0, 18) + "..." : artist) : "Unknown artist";
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayTitle, posX + spacing + spacing, posY + spacing + 1, -1, 7);
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayArtist, posX + spacing + spacing, posY + spacing + spacing + spacing - 1, ColorUtils.rgb(200, 200, 200), 7);
        if (duration > 0) {
            float adjustedWidth = width + 20;
            float progress = (float) position / duration;
            ez = 0;
            animationStep = MathUtil.fast(animationStep, progress, 6);
            Vector4i vector4i = new Vector4i(style.getFirstColor().getRGB(), style.getFirstColor().getRGB(), style.getSecondColor().getRGB(), style.getSecondColor().getRGB());
            Vector4i newvec = new Vector4i(ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42), 1f, new Vector4f(2,2,2,2), ColorUtils.rgb(32, 32, 32));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42) * animationStep, 1f, new Vector4f(2,2,2,2), newvec);
        }
        GlStateManager.popMatrix();
    }

    private void drawStyledRect(float x, float y, float width, float height, float radius, int alpha) {
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        DisplayUtils.drawRoundedRect(x, y, width + ez, height, radius, ColorUtils.rgba(21, 21, 21, alpha));
    }

    private int getOwnerPriorityIndex(IMediaSession session) {
        for (int i = 0; i < ownerPriority.size(); i++) {
            if (session.getOwner().toUpperCase().contains(ownerPriority.get(i))) {
                return i;
            }
        }
        return ownerPriority.size();
    }

    private String formatDuration(int duration) {
        int minutes = duration / 60;
        int seconds = duration % 60;
        return String.format("%02d:%02d", minutes, seconds);
    }
}
и уже регестрируем этот MediaPlayerRenderer в нашем классе HUD:

1 добавляем в элементы рендера
2 final MediaplayerRenderer mediaplayerRenderer; (ставим в любое место вне блоков ивентов)
3 в EventDisplay: if (elements.getValueByName("Медиаплеер").get()) mediaplayerRenderer.render(e);
4 в HUD создаем Dragging для него:
Dragging player = Expensive.getInstance().createDrag(this, "Player", 201, 5);
mediaplayerRenderer = new MediaplayerRenderer(player);


Всё радуемся рабочему плееру (Внимание!!! Слил, потому что довольно таки часто крашит, спустя 1 - 3 часа игры начнет тупо вылетать игра что дефаеться перезагрузкой пк но все равно медиаплеер стоящий)

Библиотека mediaplayerinfo:
а также прикрепляю SS:

Посмотреть вложение 300805
MediaPlayerLib JAR - VirusTotal ->
Пожалуйста, авторизуйтесь для просмотра ссылки.

Всех благ ;)
нахуя...
 
Начинающий
Статус
Оффлайн
Регистрация
27 Июн 2022
Сообщения
46
Реакции[?]
1
Поинты[?]
1K
Начинающий
Статус
Онлайн
Регистрация
28 Июл 2020
Сообщения
189
Реакции[?]
10
Поинты[?]
7K
ну ты бы хотя бы исходники оставил не? не думал что тут люди и с линуксом сидят? и с маком? а так смысл взял опен сурс либку и взял залил причем я уверен там были исходники от темы 0 смысла
Либа использует WinAPI, априори не соберешь под линукс и прочее
 
MetalHead
EXCLUSIVE
Статус
Оффлайн
Регистрация
20 Фев 2025
Сообщения
31
Реакции[?]
3
Поинты[?]
3K
Ай-ай-ай, Автор, библиотеки под обф кидать гнилая маза, у нас на этапе за такое опускали. Ну ничего сейчас пост выкачу с такой же штукой ток из под натива.
 
Начинающий
Статус
Онлайн
Регистрация
28 Июл 2020
Сообщения
189
Реакции[?]
10
Поинты[?]
7K
Ай-ай-ай, Автор, библиотеки под обф кидать гнилая маза, у нас на этапе за такое опускали. Ну ничего сейчас пост выкачу с такой же штукой ток из под натива.
пьянь, джарка на котлине
 
Новичок
Статус
Оффлайн
Регистрация
4 Мар 2025
Сообщения
1
Реакции[?]
0
Поинты[?]
0
Начинающий
Статус
Оффлайн
Регистрация
5 Ноя 2022
Сообщения
86
Реакции[?]
0
Поинты[?]
0
Ай-ай-ай, Автор, библиотеки под обф кидать гнилая маза, у нас на этапе за такое опускали. Ну ничего сейчас пост выкачу с такой же штукой ток из под натива.
библеотека на котлине, и то там вызывается методы с .dll
 
Начинающий
Статус
Онлайн
Регистрация
28 Июл 2020
Сообщения
189
Реакции[?]
10
Поинты[?]
7K
Скрытое содержимое
Да чо у тя не так то там, у тя есть на руках пачка методов управления аудиопотоком, вроде из MediaInfo, в либе они рабочие ес твои кнопки не пашут - значит не правильно сделан обработчик
 
Начинающий
Статус
Оффлайн
Регистрация
15 Апр 2024
Сообщения
153
Реакции[?]
5
Поинты[?]
3K
Доброго времени суток читающие, ща покажу как сделать MediaPlayer который будет получать любой играющий поток будь то YouTube, Telegram, или даже браузер, и будет рендерить табличку с автором, названием и продолжительносью (фото обложки трека можете доделать сами)

И так начнем, для создания такого чуда нам понадобиться библиотека mediaplayer-info я прикрепляю её ниже:
Нам нужно засунуть её в папку lib или Libraries в нашей пасточке, и после чего нажать Shift+Ctrl+LAlt+S одновременно, далее выбрать в колонке "Artifacts" тобишь где мы собственно говоря билдим наш читикс, и жмем на Посмотреть вложение 300802 для добавления нужной нам библиотеки, далее выбираем тут Extracted Directory: Посмотреть вложение 300803 и после ищем Mediaplayer-info (наша библиотека которая нужна для работы таблички), после добавления создаем класс MediaPlayerRenderer (импорты поставьте сами плиз:


Код:
@FieldDefaults(level = AccessLevel.PRIVATE)
@RequiredArgsConstructor
public class MediaplayerRenderer implements ElementRenderer {

    final Minecraft mc = Minecraft.getInstance();
    IMediaSession session = null;
    final Dragging drag;
    String title;
    String artist;
    int duration;
    int position;
    private final ExecutorService executorService = Executors.newSingleThreadExecutor();
    private static final List<String> ownerPriority = List.of("SPOTIFY", "CHROME");
    public float animationStep;
    float ez;

    private boolean isMediaPlayerInfoEnabled;

    @Override
    public void render(EventDisplay eventDisplay) {
        if (Expensive.getInstance().getFunctionRegistry() != null) {
            isMediaPlayerInfoEnabled = Expensive.getInstance().getFunctionRegistry().getHud().isState() && HUD.elements.getValueByName("Медиаплеер (мощные пк)").get();
        }
        MatrixStack ms = eventDisplay.getMatrixStack();
        float posX = drag.getX();
        float posY = drag.getY();
        float headSize = 0;
        float spacing = 5;
        float width = 110;
        float height = 59 / 2f;
        drag.setWidth(width);
        drag.setHeight(height);
        GlStateManager.pushMatrix();
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        drawStyledRect(posX, posY, width, height, 6, 255);
        if (isMediaPlayerInfoEnabled) {
            executorService.submit(() -> {
                try {
                    List<IMediaSession> sessions = MediaPlayerInfo.Instance != null ? MediaPlayerInfo.Instance.getMediaSessions() : null;
                    if (sessions == null || sessions.isEmpty()) {
                        //throw new IllegalStateException("Не удалось получить сессии.");
                    }
                    sessions = sessions.stream()
                            .sorted((s1, s2) -> Integer.compare(getOwnerPriorityIndex(s1), getOwnerPriorityIndex(s2)))
                            .collect(Collectors.toList());
                    IMediaSession mediaSession = sessions.stream()
                            .filter(s -> s.getMedia() != null && (!s.getMedia().getArtist().isEmpty() || !s.getMedia().getTitle().isEmpty()))
                            .findFirst()
                            .orElse(null);
                    if (mediaSession != null && mediaSession.getMedia() != null) {
                        MediaInfo media = mediaSession.getMedia();
                        title = media.getTitle();
                        artist = media.getArtist();
                        duration = (int) media.getDuration();
                        position = (int) media.getPosition();
                    } else {
                        title = "No track";
                        artist = "Unknown artist";
                        duration = 0;
                        position = 0;
                    }
                } catch (Throwable e) {
                    title = "loading...";
                    artist = "loading...";
                    duration = 0;
                    position = 0;
                    e.printStackTrace();
                }
            });
        } else {
            title = "Media Info Disabled";
            artist = "N/A";
            duration = 0;
            position = 0;
        }

        String displayTitle = title != null ? (title.length() > 22 ? title.substring(0, 22) + "..." : title) : "No track";
        String displayArtist = artist != null ? (artist.length() > 18 ? artist.substring(0, 18) + "..." : artist) : "Unknown artist";
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayTitle, posX + spacing + spacing, posY + spacing + 1, -1, 7);
        Fonts.sfMedium2.drawText(eventDisplay.getMatrixStack(), displayArtist, posX + spacing + spacing, posY + spacing + spacing + spacing - 1, ColorUtils.rgb(200, 200, 200), 7);
        if (duration > 0) {
            float adjustedWidth = width + 20;
            float progress = (float) position / duration;
            ez = 0;
            animationStep = MathUtil.fast(animationStep, progress, 6);
            Vector4i vector4i = new Vector4i(style.getFirstColor().getRGB(), style.getFirstColor().getRGB(), style.getSecondColor().getRGB(), style.getSecondColor().getRGB());
            Vector4i newvec = new Vector4i(ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255),ColorUtils.rgb(255,255,255));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42), 1f, new Vector4f(2,2,2,2), ColorUtils.rgb(32, 32, 32));
            DisplayUtils.drawRoundedRect(posX + headSize + spacing + spacing, posY + height - spacing * 2 + 5, (adjustedWidth - 42) * animationStep, 1f, new Vector4f(2,2,2,2), newvec);
        }
        GlStateManager.popMatrix();
    }

    private void drawStyledRect(float x, float y, float width, float height, float radius, int alpha) {
        Style style = Expensive.getInstance().getStyleManager().getCurrentStyle();
        DisplayUtils.drawRoundedRect(x, y, width + ez, height, radius, ColorUtils.rgba(21, 21, 21, alpha));
    }

    private int getOwnerPriorityIndex(IMediaSession session) {
        for (int i = 0; i < ownerPriority.size(); i++) {
            if (session.getOwner().toUpperCase().contains(ownerPriority.get(i))) {
                return i;
            }
        }
        return ownerPriority.size();
    }

    private String formatDuration(int duration) {
        int minutes = duration / 60;
        int seconds = duration % 60;
        return String.format("%02d:%02d", minutes, seconds);
    }
}
и уже регестрируем этот MediaPlayerRenderer в нашем классе HUD:

1 добавляем в элементы рендера
2 final MediaplayerRenderer mediaplayerRenderer; (ставим в любое место вне блоков ивентов)
3 в EventDisplay: if (elements.getValueByName("Медиаплеер").get()) mediaplayerRenderer.render(e);
4 в HUD создаем Dragging для него:
Dragging player = Expensive.getInstance().createDrag(this, "Player", 201, 5);
mediaplayerRenderer = new MediaplayerRenderer(player);


Всё радуемся рабочему плееру (Внимание!!! Слил, потому что довольно таки часто крашит, спустя 1 - 3 часа игры начнет тупо вылетать игра что дефаеться перезагрузкой пк но все равно медиаплеер стоящий)

Библиотека mediaplayerinfo:
а также прикрепляю SS:

Посмотреть вложение 300805
MediaPlayerLib JAR - VirusTotal ->
Пожалуйста, авторизуйтесь для просмотра ссылки.

Всех благ ;)
Вставь хотя бы гитхаб челика у которого ты спиздил либку XD
 
Начинающий
Статус
Оффлайн
Регистрация
18 Дек 2023
Сообщения
38
Реакции[?]
0
Поинты[?]
0
Навалил свэгу, я бы создал на хосте подхост с музыкой и сделал бы 1337 апишек на чек музыки... А так навалил бы свегу и сурсы на 2.0 закинул бы
 
Сверху Снизу