Skip to content

Commit

Permalink
Merge pull request #25 from lay295/master
Browse files Browse the repository at this point in the history
sync
  • Loading branch information
superbonaci authored Feb 26, 2024
2 parents 98a3771 + 1afcc3c commit 9ca212e
Showing 13 changed files with 1,086 additions and 28 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -16,6 +16,7 @@
This document is also available in:
- [**Spanish / Español**](README_es.md)
- [**Italian / Italiano**](README_it.md)
- [**Portuguese (Brazil) / Português (Brasil)**](README_ptbr.md)
- [**Turkish / Türkçe**](README_tr.md)

## Chat Render Example
218 changes: 218 additions & 0 deletions README_ptbr.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,218 @@
<div align="center">
<a href="https://github.com/lay295/TwitchDownloader">
<img src="TwitchDownloaderWPF/Images/Logo.png" alt="Logo" width="80" height="80">
</a>

<h3 align="center">Twitch Downloader</h3>

<div align="center">
Baixador de VOD/Clip/Chat da Twitch e Renderizador de Chat
<br />
<br />
<a href="https://github.com/lay295/TwitchDownloader/issues">Report Bug</a>
</div>
</div>

**Este arquivo Readme pode estar desatualizado, considere lê-lo em [**inglês**](README.md)**

## Exemplo do Chat Renderizado

https://user-images.githubusercontent.com/1060681/197653099-c3fd12c2-f03a-4580-84e4-63ce3f36be8d.mp4


## O quê ele pode fazer?

- Baixar VODs da Twitch
- Baixar Clips da Twitch
- Baixar o chat para VODs e Clips, seja em um arquivo [JSON com todas as informações originais](https://github.com/lay295/TwitchDownloader/files/13495494/ExampleMoonMoonJsonFile.json), um arquivo de browser HTML, ou um [arquivo de texto normal](https://github.com/lay295/TwitchDownloader/files/13495523/ExampleMoonMoonTextFile.txt)
- Atualizar os conteúdos de um arquivo do chat em JSON gerado préviamente com uma opção para salvar em outro formato
- Usar um arquivo do chat em JSON gerado préviamente para renderizar o chat com o Twitter Twemoji ou Google Noto Color emojis e emotes BTTV, FFZ, 7TV estáticos e animados

# GUI

## Windows WPF

![](https://i.imgur.com/bLegxGX.gif)

### [Veja a documentação completa do WPF aqui](TwitchDownloaderWPF/README.md).

### Funcionalidade

O GUI do Windows WPF implementa todas as principais funcionalidades do programa acompanhado com umas funcionalidades extras de conveniência:
- Programe múltiplos trabalhos de baixar/renderizar para que funcionem simultâneamente
- Criar uma lista de arquivos para baixar por uma lista de links de vods/clips
- Buscar e baixar múltiplos VODs/clips de qualquer streamer sem sair do aplicativo

### Suporte à Múltiplas línguas

O GUI do Windows WPF está disponível em múltiplas linguagens graças à traduções da comunidade. Veja a [Sessão de localização](TwitchDownloaderWPF/README.md#localization) do [WPF README](TwitchDownloaderWPF/README.md) para mais detalhes.

### Tema

O GUI do Windows WPF vêm com tanto o tema claro como o escuro, junto de uma opção para atualizar automaticamente de acordo com o tema do Windows. Ele também suporta temas criados pelo usuário! Veja a [Sessão de Tema](TwitchDownloaderWPF/README.md#theming) dos [WPF README](TwitchDownloaderWPF/README.md) para mais detalhes.

### Demonstração em Vídeo

https://www.youtube.com/watch?v=0W3MhfhnYjk
(versão mais antiga, mesmo conceito)

## Linux?

Veja twitch-downloader-gui no [github](https://github.com/mohad12211/twitch-downloader-gui) ou no [AUR](https://aur.archlinux.org/packages/twitch-downloader-gui) para um GUI wrapper para o CLI Linux .

## MacOS?

Nenhum GUI disponível pro MacOS até o momento :(

# CLI

### [Veja a documentação completa do CLI aqui](TwitchDownloaderCLI/README.md).

O CLI é cross-platform e implementa as principais funcionalidades do programa. Funciona no Windows, Linux, e MacOS<sup>*</sup>.

<sup>*Somente Macs com Intel foram testadas</sup>

Com o CLI, é possível automatizar processamento de vídeo processing com scripts externos. Por exemplo, você poderia copiar e colar o código a seguir num arquivo `.bat` no Windows para baixar um VOD e seu chat, e depois renderizar o chat, tudo de um único valor.
```bat
@echo off
set /p vodid="Insira a ID da VOD: "
TwitchDownloaderCLI.exe videodownload --id %vodid% --ffmpeg-path "ffmpeg.exe" -o %vodid%.mp4
TwitchDownloaderCLI.exe chatdownload --id %vodid% -o %vodid%_chat.json -E
TwitchDownloaderCLI.exe chatrender -i %vodid%_chat.json -h 1080 -w 422 --framerate 30 --update-rate 0 --font-size 18 -o %vodid%_chat.mp4
```

## Windows - Instalação

1. Vá para [Releases](https://github.com/lay295/TwitchDownloader/releases/) e baixe a versão mais recente para Windows ou [construa do código-fonte](#building-from-source).
2. Extraia o `TwitchDownloaderCLI.exe`.
3. Navegue para onde você extraiu o executável:
```
cd C:\folder\containing\TwitchDownloaderCLI
```
4. Se você não tem o FFmpeg, você pode instalar-lo via o [gerenciador de pacotes Chocolatey](https://community.chocolatey.org/), todavia também podes obter-lo como um arquivo separado no [ffmpeg.org](https://ffmpeg.org/download.html) ou usando o TwitchDownloaderCLI:
```
TwitchDownloaderCLI.exe ffmpeg --download
```
5. Você pode começar a usar o TwitchDownloaderCLI, por exemplo:
```
TwitchDownloaderCLI.exe videodownload --id <vod-id-here> -o out.mp4
```
Você pode encontrar mais comandos no [CLI README](TwitchDownloaderCLI/README.md#example-commands).

## Linux – Instalação

1. Algumas distros, como o Alpine Linux, não têm fontes para algumas linguagens (Árabe, Persa, Tailandês, etc.) Se este for seu caso, instale fontes familiares adicionais como [Noto](https://fonts.google.com/noto/specimen/Noto+Sans) ou leia a página da wiki de sua distro em fontes, tendo que deve haver um comando de instalação para essa situação específica, como a página de fontes do [Alpine Linux ](https://wiki.alpinelinux.org/wiki/Fonts).
2. Verifique que ambos `fontconfig` e `libfontconfig1` estão instalados. `apt-get install fontconfig libfontconfig1` no Ubuntu.
3. Vá para [Releases](https://github.com/lay295/TwitchDownloader/releases/) e baixe o binário mais recente pro Linux, pegue o [Pacote AUR](https://aur.archlinux.org/packages/twitch-downloader-bin/) pro Arch Linux, ou [construa do código-fonte](#building-from-source).
4. Extraia o `TwitchDownloaderCLI`.
5. Navegue para onde você extraiu o binário:
```
cd directory/containing/TwitchDownloaderCLI
```
6. Dê ao binário direitos de execução:
```
sudo chmod +x TwitchDownloaderCLI
```
7. a) Se você não tem o FFmpeg, você deve instalar-lo no sistema todo pelo gerenciador de pacotes da sua distro, todavia também podes obter-lo como um arquivo separado no [ffmpeg.org](https://ffmpeg.org/download.html) ou usando o TwitchDownloaderCLI:
```
./TwitchDownloaderCLI ffmpeg --download
```
7. b) Se baixado como um arquivo separado, também deve dar-lo direitos de execução com:
```
sudo chmod +x ffmpeg
```
8. Você pode começar usando o TwitchDownloaderCLI, por exemplo:
```
./TwitchDownloaderCLI videodownload --id <vod-id-here> -o out.mp4
```
Você pode encontrar mais comandos no [CLI README](TwitchDownloaderCLI/README.md#example-commands).

## MacOS – Instalação
1. Se seu dispositivo tem um processador série-M Apple Silicon, certifique-se que baixaste o binário do arm64, todavia se você prefere usar o binário em x64 no Apple Silicon deve ser rodado por uma sessão do terminal rodando dentro do Rosetta 2:
```
arch -x86_64 zsh
```
2. Vá para [Releases](https://github.com/lay295/TwitchDownloader/releases/) e baixe a versão mais recente para MacOS ou [construa do código-fonte](#building-from-source).
3. Extraia o `TwitchDownloaderCLI`.
4. Navegue para onde você extraiu o binário:
```
cd directory/containing/TwitchDownloaderCLI
```
5. Dê ao binário direitos de execução:
```
chmod +x TwitchDownloaderCLI
```
6. a) Se você não tem o FFmpeg, você deve instalar-lo no sistema todo pelo [gerenciador de pacotes Homebrew](https://brew.sh/), todavia também podes obter-lo como um arquivo separado no [ffmpeg.org](https://ffmpeg.org/download.html) ou usando o TwitchDownloaderCLI:
```
./TwitchDownloaderCLI ffmpeg --download
```
6. b) Se baixado como um arquivo separado, também deve dar-lo direitos de execução com:
```
chmod +x ffmpeg
```
7. Você pode começar a usar o TwitchDownloaderCLI, por exemplo:
```
./TwitchDownloaderCLI videodownload --id <vod-id-here> -o out.mp4
```
Você pode encontrar mais comandos no [CLI README](TwitchDownloaderCLI/README.md#example-commands).

# Construíndo do código-fonte

## Requerimentos

- [.NET 6.0.x SDK](https://dotnet.microsoft.com/en-us/download/dotnet/6.0)
- Mais ou menos 1GB de espaço de disco.

## Instruções para construção

1. Clone o repositório:
```
git clone https://github.com/lay295/TwitchDownloader.git
```
2. Navegue até a pasta da solução:
```
cd TwitchDownloader
```
3. Restaure a solução:
```
dotnet restore
```
- Dispositivos que não usam Windows devem especificar explicitamente um projeto para restaurar, i.e. `dotnet restore TwitchDownloaderCLI`
4. a) Construa o GUI:
```
dotnet publish TwitchDownloaderWPF -p:PublishProfile=Windows
```

- Perfis Aplicáveis: `Windows`, `Linux`, `LinuxAlpine`, `LinuxArm`, `LinuxArm64`, `MacOS`, `MacOSArm64`
5. a) Navegue para a pasta do GUI:
```
cd TwitchDownloaderWPF/bin/Release/net6.0-windows/publish/win-x64
```
5. b) Navegue para a pasta do CLI:
```
cd TwitchDownloaderCLI/bin/Release/net6.0/publish
```

# Créditos de terçeiros

Renderizações do Chat são renderizadas com [SkiaSharp](https://github.com/mono/SkiaSharp) e [HarfBuzzSharp](https://github.com/mono/SkiaSharp) © Microsoft Corporation.

Renderizações do Chat são codificados e Downloads do Vídeo são finalizados com [FFmpeg](https://ffmpeg.org/) © The FFmpeg developers.

Renderizações do Chat devem usar [Noto Color Emoji](https://github.com/googlefonts/noto-emoji) © Google e contributors.

Renderizações do Chat devem usar [Twemoji](https://github.com/twitter/twemoji) © Twitter e contributors.

Binários pré-instalados do FFmpeg são pegos do [gyan.dev](https://www.gyan.dev/ffmpeg/) © Gyan Doshi.

Binários do FFmpeg pegos são runtime são baixados usando [Xabe.FFmpeg.Downloader](https://github.com/tomaszzmuda/Xabe.FFmpeg) © Xabe.

Exportações do Chat em Html utilizam o typeface _Inter_ hosteados pelo [Google Fonts API](https://fonts.google.com/) © Google.

Para uma lista completa de bibliotecas externas, veja [THIRD-PARTY-LICENSES.txt](./TwitchDownloaderCore/Resources/THIRD-PARTY-LICENSES.txt).

# Licença

[MIT](./LICENSE.txt)

TwitchDownloader não é de modo algum associado com a Twitch Interactive, Inc. ou suas filiais.
2 changes: 1 addition & 1 deletion TwitchDownloaderCLI/TwitchDownloaderCLI.csproj
Original file line number Diff line number Diff line change
@@ -2,7 +2,7 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<Version>1.54.0</Version>
<Version>1.54.1</Version>
<Copyright>Copyright © lay295 and contributors</Copyright>
<Description>Download and render Twitch VODs, clips, and chats</Description>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
8 changes: 4 additions & 4 deletions TwitchDownloaderCore.Tests/TwitchDownloaderCore.Tests.csproj
Original file line number Diff line number Diff line change
@@ -11,13 +11,13 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="xunit" Version="2.6.6" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.6">
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
<PackageReference Include="xunit" Version="2.7.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.7">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="6.0.0">
<PackageReference Include="coverlet.collector" Version="6.0.1">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
24 changes: 10 additions & 14 deletions TwitchDownloaderCore/ChatRenderer.cs
Original file line number Diff line number Diff line change
@@ -1628,11 +1628,11 @@ private async Task<List<ChatBadge>> GetScaledBadges(CancellationToken cancellati
foreach (var badge in badgeTask)
{
// Assume badges are always 2x scale, not 1x or 4x
if (Math.Abs(renderOptions.ReferenceScale - 1.0) > 0.01)
var newScale = renderOptions.ReferenceScale * renderOptions.BadgeScale;
if (Math.Abs(newScale - 1.0) > 0.01)
{
badge.Resize(renderOptions.ReferenceScale * renderOptions.BadgeScale);
badge.Resize(newScale);
}
badge.VersionsData.Clear(); // Clear the image byte[]s as we aren't embedding to an output file
}

return badgeTask;
@@ -1644,12 +1644,12 @@ private async Task<List<TwitchEmote>> GetScaledEmotes(CancellationToken cancella

foreach (var emote in emoteTask)
{
double newScale = (2.0 / emote.ImageScale) * renderOptions.ReferenceScale * renderOptions.EmoteScale;
// Assume emojis are 4x scale
double newScale = emote.ImageScale * 0.5 * renderOptions.ReferenceScale * renderOptions.EmoteScale;
if (Math.Abs(newScale - 1.0) > 0.01)
{
emote.Resize(newScale);
}
emote.ImageData = Array.Empty<byte>(); // Clear the image byte[] as we aren't embedding to an output file
}

return emoteTask;
@@ -1662,12 +1662,12 @@ private async Task<List<TwitchEmote>> GetScaledThirdEmotes(CancellationToken can

foreach (var emote in emoteThirdTask)
{
double newScale = (2.0 / emote.ImageScale) * renderOptions.ReferenceScale * renderOptions.EmoteScale;
// Assume emojis are 4x scale
double newScale = emote.ImageScale * 0.5 * renderOptions.ReferenceScale * renderOptions.EmoteScale;
if (Math.Abs(newScale - 1.0) > 0.01)
{
emote.Resize(newScale);
}
emote.ImageData = Array.Empty<byte>(); // Clear the image byte[] as we aren't embedding to an output file
}

return emoteThirdTask;
@@ -1680,14 +1680,10 @@ private async Task<List<CheerEmote>> GetScaledBits(CancellationToken cancellatio
foreach (var cheer in cheerTask)
{
//Assume cheermotes are always 2x scale, not 1x or 4x
if (Math.Abs(renderOptions.ReferenceScale - 1.0) > 0.01)
{
cheer.Resize(renderOptions.ReferenceScale * renderOptions.EmoteScale);
}

foreach (var tier in cheer.tierList)
var newScale = renderOptions.ReferenceScale * renderOptions.EmoteScale;
if (Math.Abs(newScale - 1.0) > 0.01)
{
tier.Value.ImageData = Array.Empty<byte>(); // Clear the image byte[]s as we aren't embedding to an output file
cheer.Resize(newScale);
}
}

2 changes: 1 addition & 1 deletion TwitchDownloaderCore/TwitchDownloaderCore.csproj
Original file line number Diff line number Diff line change
@@ -30,7 +30,7 @@
<PackageReference Include="SkiaSharp.HarfBuzz" Version="2.88.7" />
<PackageReference Include="SkiaSharp.NativeAssets.Linux" Version="2.88.7" />
<PackageReference Include="SkiaSharp.NativeAssets.macOS" Version="2.88.7" />
<PackageReference Include="System.Text.Json" Version="8.0.1" />
<PackageReference Include="System.Text.Json" Version="8.0.2" />
<PackageReference Include="Unicode.net" Version="2.0.0" />
</ItemGroup>

2 changes: 1 addition & 1 deletion TwitchDownloaderWPF/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
@@ -78,7 +78,7 @@ private async void Window_Loaded(object sender, RoutedEventArgs e)
// it will sometimes start behind other windows, usually (but not always) due to the user's actions.
FlashTaskbarIconIfNotForeground(TimeSpan.FromSeconds(3));

var currentVersion = Version.Parse("1.54.0");
var currentVersion = Version.Parse("1.54.1");
Title = $"Twitch Downloader v{currentVersion}";

// TODO: extract FFmpeg handling to a dedicated service
1 change: 1 addition & 0 deletions TwitchDownloaderWPF/Services/AvailableCultures.cs
Original file line number Diff line number Diff line change
@@ -40,6 +40,7 @@ static AvailableCultures()
French = new Culture("fr-FR", "Français"),
Italian = new Culture("it-it", "Italiano"),
Polish = new Culture("pl-PL", "Polski"),
Polish = new Culture("pt-BR", "Português (Brasil)"),
Russian = new Culture("ru-RU", "Русский"),
Turkish = new Culture("tr-TR", "Türkçe"),
Ukrainian = new Culture("uk-ua", "Українська"),
2 changes: 1 addition & 1 deletion TwitchDownloaderWPF/Services/ThumbnailService.cs
Original file line number Diff line number Diff line change
@@ -6,7 +6,7 @@ namespace TwitchDownloaderWPF.Services
{
public static class ThumbnailService
{
public const string THUMBNAIL_MISSING_URL = @"https://vod-secure.twitch.tv/_404/404_processing_320x180.png";
internal const string THUMBNAIL_MISSING_URL = @"https://vod-secure.twitch.tv/_404/404_processing_320x180.png";

/// <exception cref="ArgumentNullException">The <paramref name="thumbUrl"/> was <see langword="null"/></exception>
public static BitmapImage GetThumb(string thumbUrl, BitmapCacheOption cacheOption = BitmapCacheOption.OnLoad)
Loading

0 comments on commit 9ca212e

Please sign in to comment.