GithubHelp home page GithubHelp logo

kubinka0505 / ifunny-captions Goto Github PK

View Code? Open in Web Editor NEW
37.0 5.0 9.0 11.14 MB

Python implementation of the iFunny GIF Captions generator.

License: GNU General Public License v3.0

Shell 0.10% Python 83.24% Batchfile 0.07% Jupyter Notebook 16.59%
ifunny captions ifunny-captions python meme-generator

ifunny-captions's Introduction

  

   

 

Description 📝

Pack of scripts providing widely customizable iFunny Captions generation.

Capabilities 📈

Android App iOS App iFunny-Captions
PNG Captions ✔️ ✔️
GIF Captions ✔️ ✔️ ✔️
MP4 Captions ✔️ ✔️
Image optimization ✔️
Custom Fonts ✔️
Characters Limit 140 ≈1000
Emoji support ✔️ ✔️ ✔️
Crop support ✔️ ✔️
Graphical User Interface ✔️ ✔️ ✔️
Command Line Interface ✔️
Batch Processing ✔️

Completed & Planned Features 🧑‍💻

  • ✔️ Completed
  • ❌ In Development

  • ✔️ PNG Captions
  • ✔️ GIF Captions
  • ✔️ Offline support
  • ✔️ Most popular GIF services support1
  • ✔️ GIF size reduction
  • ✔️ Custom fonts support2 3
  • ✔️ Transparent GIF support
  • ✔️ Program Showcase (Colab)
  • ✔️ Colab Notebook
  • ✔️ Emoji support3
  • ✔️❌ Automatic text wrap

1 - May not work with some URLs. Please look at supported GIF services below.
2 - Please look at Custom Fonts section in wiki.
3 - Problems with wrap height might occur.

Requirements 📥

Programs:

Modules:

Packages (bold links are Windows static executable binaries):

1 - Required on Linux


Installation & Usage 📝

When on Linux, install packages using this one-liner:

sudo apt-get install git python3-apt python3-pip python3-tk ffmpeg pngquant gifsicle
  1. Clone the repository and move to its directory.
    git clone http://github.com/kubinka0505/iFunny-Captions
    cd iFunny-Captions
  2. Install required modules by inputting pip install -r requirements.txt
  3. Allocate the required files to PATH system environment variable.
  4. Modify the parameters in the Config.json file. Its documentation can be found here.
  5. Open shell script file named Run. Supports positional arguments - type python iFunny_Captions.pyw -h for more.
  6. Share Your image from the Images directory.

Meta Info ℹ️

All versions of this project have been tested on:

OS Distribution OS Version Python Version System Architecture (bits)
Windows 10 3.7.6 32, 64

In case of problems create issue.


Supported GIF services 🗃️

In case if service is not working - copy its direct non-static image URL.

Tenor Giphy Gfycat Tumblr
(GIFV)
ImgFlip GifImage BestAnimations GifFinder ReactionGIFs
Tenor Giphy Gfycat Tumblr ImgFlip GifImage BestAnimations GifFinder ReactionGIFs

Comparisons 🔢

  • Software Device Time Size Preview
    iFunny's
    Android App
    Huawei P10 Lite 00:29.890
    + saving to device
    1.62 MB
    (1629670 B)
    kubinka0505's
    iFunny-Captions
    PC 00:40.514 675 KB
    (690476 B)
  • Software Device Time Size Preview
    iFunny's
    Android App
    Huawei P10 Lite 00:12.900
    + saving to device
    535 KB
    (535869 B)
    kubinka0505's
    iFunny-Captions
    Huawei P10 Lite 00:09.453 210 KB
    (214781 B)

Tested With App Version Device's Processor
PC 3.7 Intel Core i3-2120
Huawei P10 Lite 6.15.3 HiSilicon Kirin 658
Huawei P40 Lite 6.15.3 HiSilicon Kirin 810

ifunny-captions's People

Contributors

kubinka0505 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

ifunny-captions's Issues

Bug: When creating a caption for a GIF file, the script finishes but it does not make a new GIF

From what I can tell from the console output, it seems like something did not work during the Making GIF... phase

Used iFunny-Captions Version: 2.9
Image URL: https://tenor.com/Fuiq.gif
^ When I added a local file path to the config file, it gave me the following error, so I used a URL instead:
requests.exceptions.MissingSchema: Invalid URL 'Images/file.gif': No schema supplied. Perhaps you meant http://Images/file.gif?

FFmpeg Version (do not input when You made Your own build): 4.3.2
Console Log (after running python3 __init__.pyw):

Setting up utils...
URL was located in cache folder!
Copying files to main directory...
Making GIF...
Saving GIF...
gifsicle: Images/Example_X6jwNC0j.gif: No such file or directory
Optimizing...
gifsicle: Images/Example_X6jwNC0j.gif: No such file or directory
Removing Frames...
Done!

Modules were loaded in:			00:00.262396.
Input URL was converted to frames in:	00:00.000173.
Frames were processed in:		00:00.000001.
GIF was made in:			00:00.259277.
Frames were deleted in:			00:00.000261.
All operations were done in:		00:00.522108.

In case it might be a factor, the OS I'm running is Ubuntu 18.04.5 LTS

Bug: Captioning output with audio filename instead of prompting me

Additional description

I also tried using an ogg file (in case it was some weirdness with the fact that I was using the original video as the audio source) but received the same result.

Edit: Tried this with an image, same result.


iFunny-Captions Version

3.6

Used Files

Console Log:

C:\GitHub\iFunny-Captions>python __init__.pyw -t "" -i "" -p
C:\GitHub\iFunny-Captions\__init__.pyw:28: DeprecationWarning: 'emoji.UNICODE_EMOJI_ENGLISH' is deprecated and will be removed in version 2.0.0. Use 'emoji.EMOJI_DATA' instead.
To hide this warning, pin/downgrade the package to 'emoji~=1.6.3'
  from emoji import emojize, demojize, UNICODE_EMOJI_ENGLISH
> iFunny-Captions 3.6 (02.01.2022)

Set up utils...
URL was not located in cache folder!
Converting Path Image to Frames... (This can take a while)
ffmpeg version 5.0.1-full_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 11.2.0 (Rev7, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
  libavutil      57. 17.100 / 57. 17.100
  libavcodec     59. 18.100 / 59. 18.100
  libavformat    59. 16.100 / 59. 16.100
  libavdevice    59.  4.100 / 59.  4.100
  libavfilter     8. 24.100 /  8. 24.100
  libswscale      6.  4.100 /  6.  4.100
  libswresample   4.  3.100 /  4.  3.100
  libpostproc    56.  3.100 / 56.  3.100
[h264 @ 0000021457ef6d80] Reinit context to 1136x720, pix_fmt: yuv420p
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:/Users/lster/Downloads/saul.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    title           : Saul goodman 3d
    artist          : Itsnickford
    date            : 20211017
    encoder         : Lavf58.45.100
    comment         : Hello memetastic
                    : https://www.change.org/p/google-inc-fire-susan-wojcicki-as-youtube-ceo
                    : epic remix of the video: https://www.youtube.com/watch?v=LyEqj8mC7iQ
    description     : Hello memetastic
                    : https://www.change.org/p/google-inc-fire-susan-wojcicki-as-youtube-ceo
                    : epic remix of the video: https://www.youtube.com/watch?v=LyEqj8mC7iQ
  Duration: 00:00:15.56, start: 0.000000, bitrate: 678 kb/s
  Stream #0:0[0x1](und): Video: h264 (High), 1 reference frame (avc1 / 0x31637661), yuv420p(tv, bt709, progressive, left), 1132x720 (1136x720) [SAR 1:1 DAR 283:180], 544 kb/s, 30 fps, 30 tbr, 15360 tbn (default)
    Metadata:
      handler_name    : ISO Media file produced by Google Inc.
      vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : ISO Media file produced by Google Inc.
      vendor_id       : [0][0][0][0]
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> png (native))
Press [q] to stop, [?] for help
[h264 @ 0000021458560980] Reinit context to 1136x720, pix_fmt: yuv420p
[graph 0 input from stream 0:0 @ 000002145b022580] w:1132 h:720 pixfmt:yuv420p tb:1/15360 fr:30/1 sar:1/1
[auto_scale_0 @ 000002145b023f80] w:iw h:ih flags:'' interl:0
[format @ 000002145b022e80] auto-inserting filter 'auto_scale_0' between the filter 'Parsed_null_0' and the filter 'format'
[auto_scale_0 @ 000002145b023f80] w:1132 h:720 fmt:yuv420p sar:1/1 -> w:1132 h:720 fmt:rgb24 sar:1/1 flags:0x0
Output #0, image2, to 'Frame_%05d.png':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    title           : Saul goodman 3d
    artist          : Itsnickford
    date            : 20211017
    description     : Hello memetastic
                    : https://www.change.org/p/google-inc-fire-susan-wojcicki-as-youtube-ceo
                    : epic remix of the video: https://www.youtube.com/watch?v=LyEqj8mC7iQ
    comment         : Hello memetastic
                    : https://www.change.org/p/google-inc-fire-susan-wojcicki-as-youtube-ceo
                    : epic remix of the video: https://www.youtube.com/watch?v=LyEqj8mC7iQ
    encoder         : Lavf59.16.100
  Stream #0:0(und): Video: png, 1 reference frame, rgb24(pc, gbr/bt709/bt709, progressive, left), 1132x720 (0x0) [SAR 1:1 DAR 283:180], q=2-31, 200 kb/s, 30 fps, 30 tbn (default)
    Metadata:
      handler_name    : ISO Media file produced by Google Inc.
      vendor_id       : [0][0][0][0]
      encoder         : Lavc59.18.100 png
[AVIOContext @ 000002145b0fbac0] Statistics: 390194 bytes written, 0 seeks, 2 writeouts
[Cut to allow posting to GitHub]
[AVIOContext @ 000002145bbe8f80] Statistics: 426192 bytes written, 0 seeks, 2 writeouts
frame=  465 fps=225 q=-0.0 Lsize=N/A time=00:00:15.50 bitrate=N/A speed=7.49x
video:225659kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
Input file #0 (C:/Users/lster/Downloads/saul.mp4):
  Input stream #0:0 (video): 465 packets read (1054051 bytes); 465 frames decoded;
  Input stream #0:1 (audio): 1 packets read (371 bytes);
  Total: 466 packets (1054422 bytes) demuxed
Output file #0 (Frame_%05d.png):
  Output stream #0:0 (video): 465 frames encoded; 465 packets muxed (231074595 bytes);
  Total: 465 packets (231074595 bytes) muxed
[AVIOContext @ 0000021457eed7c0] Statistics: 1360292 bytes read, 2 seeks
Copying 465 frames to main directory...
Making GIF...
<string>:96: DeprecationWarning: The parameter 'use_aliases' in emoji.emojize() is deprecated and will be removed in version 2.0.0. Use language='alias' instead.
To hide this warning, pin/downgrade the package to 'emoji~=1.6.3'
<string>:26: DeprecationWarning: LANCZOS is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.LANCZOS instead.
Saving GIF...
ffmpeg version 5.0.1-full_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 11.2.0 (Rev7, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
  libavutil      57. 17.100 / 57. 17.100
  libavcodec     59. 18.100 / 59. 18.100
  libavformat    59. 16.100 / 59. 16.100
  libavdevice    59.  4.100 / 59.  4.100
  libavfilter     8. 24.100 /  8. 24.100
  libswscale      6.  4.100 /  6.  4.100
  libswresample   4.  3.100 /  4.  3.100
  libpostproc    56.  3.100 / 56.  3.100
Input #0, image2, from 'Frame_%05d.png':
  Duration: 00:00:18.60, start: 0.000000, bitrate: N/A
  Stream #0:0: Video: png, rgb24(pc), 1132x996, 25 fps, 25 tbr, 25 tbn
Codec AVOption gifflags (set GIF flags) specified for output file #0 (Palette.png) has not been used for any stream. The most likely reason is either wrong type (e.g. a video option with no video streams) or that it is a private option of some encoder which was not actually used for any stream.
Stream mapping:
  Stream #0:0 -> #0:0 (png (native) -> png (native))
Press [q] to stop, [?] for help
[Parsed_palettegen_0 @ 000001fd4b40b640] 255(+1) colors generated out of 54339 colors; ratio=0.004693
Output #0, image2, to 'Palette.png':
  Metadata:
    encoder         : Lavf59.16.100
  Stream #0:0: Video: png, rgba(pc, gbr/unknown/unknown, progressive), 16x16 [SAR 1:1 DAR 1:1], q=2-31, 200 kb/s, 25 fps, 25 tbn
    Metadata:
      encoder         : Lavc59.18.100 png
frame=    1 fps=0.3 q=-0.0 Lsize=N/A time=00:00:00.04 bitrate=N/A speed=0.0107x
video:1kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
ffmpeg version 5.0.1-full_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 11.2.0 (Rev7, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
  libavutil      57. 17.100 / 57. 17.100
  libavcodec     59. 18.100 / 59. 18.100
  libavformat    59. 16.100 / 59. 16.100
  libavdevice    59.  4.100 / 59.  4.100
  libavfilter     8. 24.100 /  8. 24.100
  libswscale      6.  4.100 /  6.  4.100
  libswresample   4.  3.100 /  4.  3.100
  libpostproc    56.  3.100 / 56.  3.100
Input #0, image2, from 'Frame_%05d.png':
  Duration: 00:00:18.60, start: 0.000000, bitrate: N/A
  Stream #0:0: Video: png, rgb24(pc), 1132x996, 25 fps, 25 tbr, 25 tbn
Input #1, png_pipe, from 'Palette.png':
  Duration: N/A, bitrate: N/A
  Stream #1:0: Video: png, rgba(pc), 16x16 [SAR 1:1 DAR 1:1], 25 fps, 25 tbr, 25 tbn
Stream mapping:
  Stream #0:0 (png) -> paletteuse
  Stream #1:0 (png) -> paletteuse
  paletteuse:default -> Stream #0:0 (gif)
Press [q] to stop, [?] for help
[image2 @ 000002232654f700] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
Output #0, gif, to 'C:\GitHub\iFunny-Captions\Images\saulgoodman3d_AWNIuOfJ.gif':
  Metadata:
    encoder         : Lavf59.16.100
  Stream #0:0: Video: gif, pal8(pc, gbr/unknown/unknown, progressive), 1132x996, q=2-31, 200 kb/s, 25 fps, 100 tbn
    Metadata:
      encoder         : Lavc59.18.100 gif
frame=  465 fps= 18 q=-0.0 Lsize=  121591kB time=00:00:18.57 bitrate=53639.1kbits/s speed=0.711x
video:121591kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000016%
> [C:\GitHub\iFunny-Captions\Images\saulgoodman3d_AWNIuOfJ.gif]
gifsicle.exe: warning: useless interlace-related frame option
  (It didn't affect any frame.)
gifsicle.exe: warning: useless comment-related frame option
gifsicle.exe: warning: useless extension-related frame option
Making Video... (MP4, x264 | AAC 128 kb/s)
ffmpeg version 5.0.1-full_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 11.2.0 (Rev7, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
  libavutil      57. 17.100 / 57. 17.100
  libavcodec     59. 18.100 / 59. 18.100
  libavformat    59. 16.100 / 59. 16.100
  libavdevice    59.  4.100 / 59.  4.100
  libavfilter     8. 24.100 /  8. 24.100
  libswscale      6.  4.100 /  6.  4.100
  libswresample   4.  3.100 /  4.  3.100
  libpostproc    56.  3.100 / 56.  3.100
Routing option strict to both codec and muxer layer
Input #0, gif, from 'C:\GitHub\iFunny-Captions\Images\saulgoodman3d_AWNIuOfJ.gif':
  Duration: 00:00:18.60, start: 0.000000, bitrate: 53552 kb/s
  Stream #0:0: Video: gif, 1 reference frame, bgra, 1132x996, 25 fps, 25 tbr, 100 tbn
[h264 @ 000002699518ebc0] Reinit context to 1136x720, pix_fmt: yuv420p
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\Users\lster\Downloads\saulgoodman3d.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    title           : Saul goodman 3d
    artist          : Itsnickford
    date            : 20211017
    encoder         : Lavf58.45.100
    comment         : Hello memetastic
                    : https://www.change.org/p/google-inc-fire-susan-wojcicki-as-youtube-ceo
                    : epic remix of the video: https://www.youtube.com/watch?v=LyEqj8mC7iQ
    description     : Hello memetastic
                    : https://www.change.org/p/google-inc-fire-susan-wojcicki-as-youtube-ceo
                    : epic remix of the video: https://www.youtube.com/watch?v=LyEqj8mC7iQ
  Duration: 00:00:15.56, start: 0.000000, bitrate: 678 kb/s
  Stream #1:0[0x1](und): Video: h264 (High), 1 reference frame (avc1 / 0x31637661), yuv420p(tv, bt709, progressive, left), 1132x720 (1136x720) [SAR 1:1 DAR 283:180], 544 kb/s, 30 fps, 30 tbr, 15360 tbn (default)
    Metadata:
      handler_name    : ISO Media file produced by Google Inc.
      vendor_id       : [0][0][0][0]
  Stream #1:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : ISO Media file produced by Google Inc.
      vendor_id       : [0][0][0][0]
Stream mapping:
  Stream #0:0 -> #0:0 (gif (native) -> h264 (libx264))
  Stream #1:1 -> #0:1 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
[graph 0 input from stream 0:0 @ 000002699558eb80] w:1132 h:996 pixfmt:bgra tb:1/100 fr:25/1 sar:0/1
[auto_scale_0 @ 00000269956183c0] w:iw h:ih flags:'' interl:0
[format @ 0000026995616f80] auto-inserting filter 'auto_scale_0' between the filter 'Parsed_pad_0' and the filter 'format'
[Parsed_pad_0 @ 00000269954a7000] w:1132 h:996 -> w:1132 h:996 x:0 y:0 color:0x000000FF
[auto_scale_0 @ 00000269956183c0] w:1132 h:996 fmt:bgra sar:0/1 -> w:1132 h:996 fmt:yuv420p sar:0/1 flags:0x0
[libx264 @ 0000026994edcfc0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 0000026994edcfc0] profile High, level 3.2, 4:2:0, 8-bit
[libx264 @ 0000026994edcfc0] 264 - core 164 r3094 bfc87b7 - H.264/MPEG-4 AVC codec - Copyleft 2003-2022 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:-3:-3 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=2.00:0.70 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-4 threads=18 lookahead_threads=3 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.20
[graph_1_in_1_1 @ 00000269933a8e80] tb:1/44100 samplefmt:fltp samplerate:44100 chlayout:0x3
[Parsed_aresample_0 @ 0000026995766d40] ch:2 chl:stereo fmt:fltp r:44100Hz -> ch:2 chl:stereo fmt:fltp r:44100Hz
Output #0, mp4, to 'C:\GitHub\iFunny-Captions\Images\saulgoodman3d_AWNIuOfJ_.mp4':
  Metadata:
    encoder         : Lavf59.16.100
  Stream #0:0: Video: h264, 1 reference frame (avc1 / 0x31637661), yuv420p(tv, progressive), 1132x996 (0x0), q=2-31, 25 fps, 12800 tbn
    Metadata:
      encoder         : Lavc59.18.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
  Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, delay 1024, 128 kb/s (default)
    Metadata:
      handler_name    : ISO Media file produced by Google Inc.
      vendor_id       : [0][0][0][0]
      encoder         : Lavc59.18.100 aac
No more output streams to write to, finishing.e=00:00:14.00 bitrate=1947.2kbits/s speed= 4.6x
[mp4 @ 0000026994f8ec00] Starting second pass: moving the moov atom to the beginning of the file
[AVIOContext @ 0000026996d6d3c0] Statistics: 4798017 bytes read, 0 seeks
frame=  453 fps=128 q=-1.0 Lsize=    4700kB time=00:00:18.00 bitrate=2139.2kbits/s speed=5.08x
video:4442kB audio:244kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.318802%
Input file #0 (C:\GitHub\iFunny-Captions\Images\saulgoodman3d_AWNIuOfJ.gif):
  Input stream #0:0 (video): 454 packets read (122909020 bytes); 454 frames decoded;
  Total: 454 packets (122909020 bytes) demuxed
Input file #1 (C:\Users\lster\Downloads\saulgoodman3d.mp4):
  Input stream #1:0 (video): 0 packets read (0 bytes);
  Input stream #1:1 (audio): 670 packets read (249059 bytes); 670 frames decoded (686080 samples);
  Total: 670 packets (249059 bytes) demuxed
Output file #0 (C:\GitHub\iFunny-Captions\Images\saulgoodman3d_AWNIuOfJ_.mp4):
  Output stream #0:0 (video): 453 frames encoded; 453 packets muxed (4548365 bytes);
  Output stream #0:1 (audio): 670 frames encoded (686080 samples); 671 packets muxed (249603 bytes);
  Total: 1124 packets (4797968 bytes) muxed
[AVIOContext @ 0000026994f86780] Statistics: 9611253 bytes written, 4 seeks, 41 writeouts
[libx264 @ 0000026994edcfc0] frame I:2     Avg QP:15.06  size: 54366
[libx264 @ 0000026994edcfc0] frame P:114   Avg QP:16.88  size: 19708
[libx264 @ 0000026994edcfc0] frame B:337   Avg QP:19.82  size:  6505
[libx264 @ 0000026994edcfc0] consecutive B-frames:  0.7%  0.4%  0.0% 98.9%
[libx264 @ 0000026994edcfc0] mb I  I16..4: 31.1% 44.5% 24.4%
[libx264 @ 0000026994edcfc0] mb P  I16..4:  1.7%  5.0%  1.0%  P16..4: 22.0%  9.0%  8.5%  0.0%  0.0%    skip:52.7%
[libx264 @ 0000026994edcfc0] mb B  I16..4:  0.2%  0.4%  0.0%  B16..8: 29.1%  1.8%  0.4%  direct: 2.1%  skip:66.0%  L0:46.9% L1:51.0% BI: 2.1%
[libx264 @ 0000026994edcfc0] 8x8 transform intra:62.5% inter:84.8%
[libx264 @ 0000026994edcfc0] coded y,uvDC,uvAC intra: 51.6% 57.8% 20.1% inter: 10.3% 9.3% 0.1%
[libx264 @ 0000026994edcfc0] i16 v,h,dc,p: 34% 29% 14% 23%
[libx264 @ 0000026994edcfc0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 26% 15% 36%  4%  4%  5%  3%  4%  3%
[libx264 @ 0000026994edcfc0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 41% 19% 21%  3%  4%  5%  3%  3%  2%
[libx264 @ 0000026994edcfc0] i8c dc,h,v,p: 54% 19% 22%  5%
[libx264 @ 0000026994edcfc0] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 0000026994edcfc0] ref P L0: 59.0% 10.8% 22.7%  7.4%
[libx264 @ 0000026994edcfc0] ref B L0: 85.8% 11.7%  2.5%
[libx264 @ 0000026994edcfc0] ref B L1: 94.7%  5.3%
[libx264 @ 0000026994edcfc0] kb/s:2007.80
[aac @ 0000026994f85e40] Qavg: 1515.512
[AVIOContext @ 0000026994edeec0] Statistics: 380502519 bytes read, 464 seeks
[AVIOContext @ 000002699518e6c0] Statistics: 1360292 bytes read, 2 seeks
ffmpeg version 5.0.1-full_build-www.gyan.dev Copyright (c) 2000-2022 the FFmpeg developers
  built with gcc 11.2.0 (Rev7, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libdavs2 --enable-libuavs3d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
  libavutil      57. 17.100 / 57. 17.100
  libavcodec     59. 18.100 / 59. 18.100
  libavformat    59. 16.100 / 59. 16.100
  libavdevice    59.  4.100 / 59.  4.100
  libavfilter     8. 24.100 /  8. 24.100
  libswscale      6.  4.100 /  6.  4.100
  libswresample   4.  3.100 /  4.  3.100
  libpostproc    56.  3.100 / 56.  3.100
Routing option strict to both codec and muxer layer
[h264 @ 000001ac95dd6f40] Reinit context to 1136x1008, pix_fmt: yuv420p
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\GitHub\iFunny-Captions\Images\saulgoodman3d_AWNIuOfJ_.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf59.16.100
  Duration: 00:00:18.12, start: 0.000000, bitrate: 2125 kb/s
  Stream #0:0[0x1](und): Video: h264 (High), 1 reference frame (avc1 / 0x31637661), yuv420p(progressive, left), 1132x996 (1136x1008), 2008 kb/s, 25 fps, 25 tbr, 12800 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : ISO Media file produced by Google Inc.
      vendor_id       : [0][0][0][0]
Stream mapping:
  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
  Stream #0:1 -> #0:1 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
[h264 @ 000001ac95f3c880] Reinit context to 1136x1008, pix_fmt: yuv420p
[graph_1_in_0_1 @ 000001ac973f2540] tb:1/44100 samplefmt:fltp samplerate:44100 chlayout:0x3
[graph 0 input from stream 0:0 @ 000001ac973f2040] w:1132 h:996 pixfmt:yuv420p tb:1/12800 fr:25/1 sar:0/1
[libx264 @ 000001ac95ddac40] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
[libx264 @ 000001ac95ddac40] profile High, level 3.2, 4:2:0, 8-bit
[libx264 @ 000001ac95ddac40] 264 - core 164 r3094 bfc87b7 - H.264/MPEG-4 AVC codec - Copyleft 2003-2022 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=18 lookahead_threads=3 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'C:\GitHub\iFunny-Captions\Images\saulgoodman3d_AWNIuOfJ.mp4':
  Metadata:
    handler_name    : VideoHandler
    vendor_id       : [0][0][0][0]
    encoder         : Lavf59.16.100
  Stream #0:0: Video: h264, 1 reference frame (avc1 / 0x31637661), yuv420p(progressive, left), 1132x996 (0x0), q=2-31, 25 fps, 12800 tbn (default)
    Metadata:
      encoder         : Lavc59.18.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
  Stream #0:1: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, delay 1024, 128 kb/s (default)
    Metadata:
      encoder         : Lavc59.18.100 aac
No more output streams to write to, finishing.e=00:00:14.69 bitrate= 998.8kbits/s speed=9.53x
frame=  390 fps=193 q=-1.0 Lsize=    3000kB time=00:00:15.55 bitrate=1579.9kbits/s speed= 7.7x
video:2743kB audio:243kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.473857%
Input file #0 (C:\GitHub\iFunny-Captions\Images\saulgoodman3d_AWNIuOfJ_.mp4):
  Input stream #0:0 (video): 453 packets read (4548366 bytes); 453 frames decoded;
  Input stream #0:1 (audio): 671 packets read (249603 bytes); 670 frames decoded (686080 samples);
  Total: 1124 packets (4797969 bytes) demuxed
Output file #0 (C:\GitHub\iFunny-Captions\Images\saulgoodman3d_AWNIuOfJ.mp4):
  Output stream #0:0 (video): 390 frames encoded; 390 packets muxed (2809017 bytes);
  Output stream #0:1 (audio): 670 frames encoded (686080 samples); 671 packets muxed (248869 bytes);
  Total: 1061 packets (3057886 bytes) muxed
[AVIOContext @ 000001ac9607ed80] Statistics: 3072380 bytes written, 2 seeks, 15 writeouts
[libx264 @ 000001ac95ddac40] frame I:2     Avg QP:15.52  size: 48765
[libx264 @ 000001ac95ddac40] frame P:109   Avg QP:18.15  size: 13798
[libx264 @ 000001ac95ddac40] frame B:279   Avg QP:21.12  size:  4326
[libx264 @ 000001ac95ddac40] consecutive B-frames:  1.0% 10.8%  0.0% 88.2%
[libx264 @ 000001ac95ddac40] mb I  I16..4: 33.6% 44.1% 22.2%
[libx264 @ 000001ac95ddac40] mb P  I16..4:  2.1%  6.7%  0.6%  P16..4: 26.3%  6.5%  3.4%  0.0%  0.0%    skip:54.4%
[libx264 @ 000001ac95ddac40] mb B  I16..4:  0.1%  0.5%  0.0%  B16..8: 27.0%  1.2%  0.2%  direct: 0.8%  skip:70.2%  L0:46.4% L1:52.2% BI: 1.4%
[libx264 @ 000001ac95ddac40] 8x8 transform intra:68.3% inter:87.5%
[libx264 @ 000001ac95ddac40] coded y,uvDC,uvAC intra: 48.9% 56.0% 10.9% inter: 6.2% 8.0% 0.0%
[libx264 @ 000001ac95ddac40] i16 v,h,dc,p: 29% 29% 14% 28%
[libx264 @ 000001ac95ddac40] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 27% 17% 34%  4%  3%  5%  3%  3%  3%
[libx264 @ 000001ac95ddac40] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 41% 19% 19%  4%  4%  5%  3%  3%  2%
[libx264 @ 000001ac95ddac40] i8c dc,h,v,p: 53% 20% 23%  4%
[libx264 @ 000001ac95ddac40] Weighted P-Frames: Y:0.0% UV:0.0%
[libx264 @ 000001ac95ddac40] ref P L0: 67.0%  8.7% 18.0%  6.3%
[libx264 @ 000001ac95ddac40] ref B L0: 89.3%  8.6%  2.1%
[libx264 @ 000001ac95ddac40] ref B L1: 95.7%  4.3%
[libx264 @ 000001ac95ddac40] kb/s:1440.17
[aac @ 000001ac95f3b800] Qavg: 1428.999
[AVIOContext @ 000001ac95dce540] Statistics: 4896273 bytes read, 1 seeks
Removing image caption...
Adding metadata...
Removing Frames...
Done!

Output file:
        Name            saulgoodman3d_AWNIuOfJ.mp4
        Absolute path   C:\GitHub\iFunny-Captions\Images\saulgoodman3d_AWNIuOfJ.mp4

Modules were loaded in:                 00:00.582.
Input file was converted to frames in:  00:02.457.
Frames were processed in:               01:11.576.
GIF was made in:                        00:35.767.
Frames were deleted in:                 00:00.094.
Video was made in:                      00:05.789.
All operations were done in:            01:56.267.

Bug: File "C:\Users\[user]\Downloads\iFunny-Captions-3.6\iFunny-Captions-3.6\__init__.pyw", line 8, in <module> from sty import fg


iFunny-Captions Version 3.6

Using the terminal and running it as "PS [<- tested it on command line as well] C:\Users\duckr\Downloads\iFunny-Captions-3.6\iFunny-Captions-3.6> C:\Users\duckr\Downloads\iFunny-Captions-3.6\iFunny-Captions-3.6\Run.bat" and I got the error shown in the title along with no funny kanye west gif

Console Log:

...  File "C:\Users\duckr\Downloads\iFunny-Captions-3.6\iFunny-Captions-3.6\__init__.pyw", line 8, in <module>
    from sty import fg

Bug: window closing instantly after opening

For some reason the CMD window immediately closes right after i launch "run.bat" so im not able to see what the error is. i recorded my screen in slo-motion and got the following error. "error: the following arguments are required: -t/--text, -i/--image". I have set "Logs" to both true and false and get the same result.
IMG_7110

Additional description

I tired to run the google colab version aswell but that also did not work for me, i got the following error.
collab_error


iFunny-Captions Version

3.5

Used Files

Optional

Image/Video that you wanted to caption
Attach if not URL

-->

Console Log:

...

Feature Request:

Describe Your feature request:

how to add different language, for example cyrllic?

Feature Request: Allow running tool on MacOS and other Linux distributions

Describe Your feature request:
Cache querying system is currently non-portable.

if not system() == "Windows":
import apt
cache = apt.Cache()

This block of code works on Windows and Debian/Ubuntu, but fails on any other OS, for example MacOS and Arch Linux.
Here is a docker file reproducing the error "ModuleNotFoundError: No module named 'apt'":

https://pastebin.com/E4X7F1x4

Make sure to run the image several times since sometimes the tool flukes and does not report error.

Why should I add that?:

This would allow running the tool on MacOS and linux distributions other than Debian derivatives like Ubuntu.

Bug: Null KeyError

Additional description


iFunny-Captions Version 3.6

Running batch file and adding gif produces a KeyError. I assume it's to do with FFmpeg and other being assigned null value in Config.

Console Log:

C:\Users\htemp\AppData\Local\Programs\Python\Python310\iFunny-Captions>python __init__.pyw -t "" -i "" -p
C:\Users\htemp\AppData\Local\Programs\Python\Python310\iFunny-Captions\__init__.pyw:28: DeprecationWarning: 'emoji.UNICODE_EMOJI_ENGLISH' is deprecated and will be removed in version 2.0.0. Use 'emoji.EMOJI_DATA' instead.
To hide this warning, pin/downgrade the package to 'emoji~=1.6.3'
  from emoji import emojize, demojize, UNICODE_EMOJI_ENGLISH
> iFunny-Captions 3.6 (02.01.2022)

Set up utils...
Traceback (most recent call last):
  File "C:\Users\htemp\AppData\Local\Programs\Python\Python310\iFunny-Captions\__init__.pyw", line 88, in <module>
    exec(open_("Packages_Location/FFmpeg"))
  File "<string>", line 15, in <module>
KeyError: None

Bug: KeyError immediately on run.

Used iFunny-Captions Version: 3.0
**Image URL: here

FFmpeg Version (do not input when You made Your own build): 4.4
Console Log:

Set up utils...
Traceback (most recent call last):
  File "/home/argent/dev/iFunny-Captions/__init__.pyw", line 48, in <module>
    exec(open("Scripts/Main/Packages_Location/FFmpeg.pyw", encoding = "utf-8").read())
  File "<string>", line 13, in <module>
  File "<string>", line 88, in VariableSearch
  File "/usr/lib/python3.9/os.py", line 679, in __getitem__
    raise KeyError(key) from None
KeyError: 'Path'

All settings are default except for the text and image URL. Running Arch Linux.

FFmpeg not found

`C:\Users\Satoscio\Desktop\iFunny-Captions>python init.pyw
Set up utils...

FFmpeg not found! ("D:\Programmi\ffmpeg\ffmpeg-4.3.1-2021-01-01-full_build\bin")
Image will not be processed.`

I have everything installed including FFmpeg but it just doesn't want to work

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.