• Stars
    star
    1,301
  • Rank 34,637 (Top 0.8 %)
  • Language
    Haskell
  • License
    BSD 3-Clause "New...
  • Created over 8 years ago
  • Updated over 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

😎 The open-source, Haskell-built video editor for GIF makers.

Gifcurry

Tell me about Gifcurry. 😃

Gifcurry is the open-source, Haskell-built video editor for GIF makers. Load a video, make some edits, and save it as a GIF—Gifcurry makes your life easy! 😎 Most video formats should work, so go wild. And since it's made with Haskell, you know it's good. 💯

For the command line averse, there is a GUI. 🖱️ Die-hard terminal aficionado? Gifcurry has you covered with its CLI. 🖥️ And for the Haskell programmers out there, there is also a library 📚 API.

Gifcurry can save your creation as a GIF or as a video. 📼 So if you hate 😠 GIFs with a passion—no problem! Just select "Save as a Video" and do your part to rid 🗑️ the world of GIFs.

Enjoy memes? :trollface: Great! Gifcurry can add text all over your GIF. You can change the font, size, color, position, outline, rotation, and the timing. Create the next viral meme with Gifcurry.

Did you know Gifcurry slices...and dices? 🍴 You can crop ✂️ from the left, the right, the top, and/or the bottom. With Gifcurry, you can slice up some tasty GIFs.

Is Gifcurry another Electron app? No way! Gifcurry is 100% #ElectronFree. No need to download more RAM 🐏, Gifcurry is light as a feather. Run 🏃 it all day, run it all year—you'll never notice.

"So...Gifcurry is just FFmpeg and ImageMagick?"—nope. Gifcurry hides all the goofy details so you can concentrate on what matters—the almighty 🙌 GIF.

Become a GIF master 💪 with Gifcurry!

What do I need Gifcurry for? 🤔

☑️ Want to show off that new UI feature in a pull request? Gifcurry.
☑️ Your template doesn't allow video in the hero image? Gifcurry.
☑️ No GIF of your favorite movie scene? Gifcurry.
☑️ Need a custom animated emoji for Slack? Gifcurry.
☑️ Can't find the perfect GIF for that reply-all email? Gifcurry.
☑️ Your README needs a GIF? Gifcurry.
☑️ That presentation slide could use some animation? Gifcurry.
☑️ Video doesn't auto play on iOS? Gifcurry.
☑️ Time to promote your indie game? Gifcurry.
☑️ Need to add subtitles to a video? Gifcurry.

Gifcurry comes in handy 🔧 for all sorts of scenarios.

What does the GUI look 👀 like?

Gifcurry GUI

How do I use the command line interface (CLI)? 🖥️

gifcurry_cli [OPTIONS]

FILE IO:
  -i --input-file=FILE   The input video file path.
  -o --output-file=FILE  The output GIF file path.
  -m --save-as-video     If present, saves the GIF as a video.
TIME:
  -s --start-time=NUM    The start time (in seconds) for the first frame.
  -e --end-time=NUM      The end time (in seconds) for the last frame.
OUTPUT FILE SIZE:
  -w --width=INT         How wide the output needs to be. Height will scale
                         to match.
  -f --fps=INT           How many frames per second the output should have.
  -c --color-count=INT   How many colors are used in the output.
  -d --dither            If present, uses dither.
CROP:
  -L --left-crop=NUM     The amount you wish to crop from the left.
  -R --right-crop=NUM    The amount you wish to crop from the right.
  -T --top-crop=NUM      The amount you wish to crop from the top.
  -B --bottom-crop=NUM   The amount you wish to crop from the bottom.
TEXT:
  -t --text-file=FILE    Either a text overlays YAML or SRT subtitles file
                         path.
  -? --help              Display help message
  -V --version           Print version information

Visit https://github.com/lettier/gifcurry for more information.

Got a CLI example?

gifcurry_cli \
  -i ~/Videos/video.webm \
  -o ~/tmp/test \
  -s 150 \
  -e 151 \
  -t ~/tmp/text-overlays.yaml \
  -w 800 \
  -f 15 \
  -c 100 \
  -d
  -L 0.1 \
  -R 0.1 \
  -T 0.1 \
  -B 0.1 \
  -m

         ▄▄▄▄▄▄▄▄                                                                             
     ▄▄████    ▀▀███▄                                                                         
      ████▀   ▄    ▀███           ▄     ▐██▌   ▄███▄                                          
  ▄   ▐███   ████   ▀███      ▄███▀▀██        ███                                             
 ▐█▌   ██   ▐███     ████    ███        ▐██  █████▌ ▄█████ ▐██▌  ██▌  ██▄██▌ ██▄██▌ ██▌   ███ 
 ███   ▐▌   ███      ▐███▌   ███  ████▌ ▐██   ██▌  ███     ▐██▌  ██▌  ███▀   ███▀   ▐██  ███  
 ████      ███▀  ▐█   ███▌   ███    ██▌ ▐██   ██▌  ███     ▐██▌  ██▌  ██▌    ██▌     ██▌▐██   
 ▐███▄    ▐██▌   ██    ██     ███▄▄▄██▌ ▐██   ██▌   ███▄▄█  ███▄███▌  ██▌    ██▌      ████▌   
  ▀███   ▀███   ▐███   ▀        ▀▀▀▀▀    ▀▀   ▀▀      ▀▀▀     ▀▀▀     ▀▀     ▀▀        ███    
    ███▄   ▀    ████▌                                                                ███▀     
      ▀███▄▄   █████▀                                                                         
          ▀▀▀▀▀▀▀                                                                             


Gifcurry 6.0.1.0
(C) 2016 David Lettier
lettier.com

[INFO] Here are your settings.

  - FILE IO:
    - Input File:    /home/Videos/video.webm
    - Output File:   /home/tmp/test.webm
    - Save As Video: Yes
  - TIME:
    - Start Second: 150.000
    - End   Second: 151.000
  - OUTPUT FILE SIZE:
    - Width:       800px
    - FPS:         15
    - Color Count: 100
    - Dither:      True
  - TEXT:
    - Text: This is a test.
      - Font:
        - Family:  Sans
        - Size:    30
        - Style:   Normal
        - Stretch: Normal
        - Weight:  800
      - Time:
        - Start Second: 150.000
        - End   Second: 151.000
      - Translation:
        - Origin: NorthWest
        - X:      0.0
        - Y:      0.0
      - Rotation:
        - Degrees: 0
      - Outline:
        - Size: 10
        - Color: rgb(1,100,10)
      - Fill:
        - Color: rgb(255,255,0)
  - CROP:
    - Left:   0.100
    - Right:  0.100
    - Top:    0.100
    - Bottom: 0.100

[INFO] Writing the temporary frames to: /home/.cache/gifcurry/gifcurry-frames30450
[INFO] Adding text.
[INFO] Converting the frames to the specified color count.
[INFO] Saving your video to: /home/tmp/test.webm
[INFO] All done.

What is the format for the text overlays YAML file? 🔢

Here's an example file:

- text: This is an example.
  fontFamily:   Sans
  fontStyle:    Oblique
  fontStretch:  Normal
  fontWeight:   30
  fontSize:     800
  origin:       NorthWest
  xTranslation: 0.0
  yTranslation: 0.0
  rotation:     20
  startTime:    5.000
  endTime:      8.000
  outlineSize:  7
  outlineColor: rgba(1,100,10,1.0)
  fillColor:    rgba(255,255,0,0.0)
- text: This is another example.
  fontFamily:   Serif
  fontStyle:    Italic
  fontStretch:  Condensed
  fontWeight:   30
  fontSize:     800
  origin:       Center
  xTranslation: 10.0
  yTranslation: 11.0
  rotation:     20
  startTime:    5.000
  endTime:      8.000
  outlineSize:  7
  outlineColor: rgb(1,11,100)
  fillColor:    rgba(255,0,0,0.0)

fontStyle can be:

  • Any
  • Italic
  • Normal
  • Oblique

fontStretch can be:

  • Any
  • Condensed
  • Expanded
  • ExtraCondensed
  • ExtraExpanded
  • Normal
  • SemiCondensed
  • SemiExpanded
  • UltraCondensed
  • UltraExpanded

origin can be:

  • North
  • NorthEast
  • East
  • SouthEast
  • South
  • SouthWest
  • West
  • NorthWest

outlineSize ranges from 0 to 10.

outlineColor and fillColor can either be rgba(red,green,blue,alpha) or rgb(red,green,blue) where red, green, and blue range from 0 to 255 and alpha ranges from 0.0 to 1.0.

How do I get a copy of Gifcurry? 💾

Gifcurry works on Linux, Mac, and most likely Windows. Make sure you have FFmpeg, GStreamer, ImageMagick, and GTK+ installed on your machine. To find the latest version of Gifcurry, head over to the releases page.

I use Linux. 🐧

If you use Linux then the easiest way to grab a copy of Gifcurry is by downloading the AppImage. After you download the AppImage, right click on it, select permissions, and check the box near execute. With that out of the way—you're all set—just double click on the AppImage and the GUI will fire right up.

You can also download and install the AppImage using the handy AppImage install script (right click and save link as). Download the script, right click on it, select permissions, check the box near execute, and double click on it. You should now see Gifcurry listed alongside your other installed programs.

If you want the CLI then download the prebuilt version for Linux, extract it, open up your terminal, cd to the bin folder, and then run gifcurry_cli -?. As an added bonus, inside the bin directory is the GUI version too so now you have both.

I use Arch/Manjaro/Antergos/pacman. 👻

If you'd rather install Gifcurry via pacman then copy the following into your terminal.

cd
sudo pacman -S git ffmpeg imagemagick gstreamer gst-plugins-base-libs gst-plugins-base gst-plugins-good gst-plugins-bad gst-libav
cd "$HOME/Downloads"
git clone https://aur.archlinux.org/gifcurry.git
cd gifcurry
makepkg -sic
cd "$HOME/Downloads"
rm -rf gifcurry
cd
gifcurry_cli -?
gifcurry_gui

I use Ubuntu/Mint/Debian/Deepin/snap. 🌀

Gifcurry is available as a snap from Snapcraft. If you don't already have snap, go ahead and install it using the command sudo apt install snapd.

You can install the Gifcurry snap right from your browser or via the command line. For the command line route, paste the following into your terminal.

snap install gifcurry
sudo snap connect gifcurry:removable-media
gifcurry

The Gifcurry snap only comes with the GUI. If you want the CLI, download the prebuilt version for Linux.

I use Mac. 🍎

Mac users can download the Mac install script by holding down control, clicking the link, selecting "Save Link As...", selecting where Downloads, and clicking save. To run the script, hold down the command key and press the space bar. Now type terminal and hit enter. After the terminal comes up, copy and paste the following.

cd ~/Downloads
chmod +x gifcurry-mac-install-script.command
./gifcurry-mac-install-script.command

After running the install script, a shortcut to both the Gifcurry GUI and CLI will be on your desktop.

I'm a Haskell developer. 🔨

If you develop Haskell programs then the easiest way to build Gifcurry is with Haskell Stack. Copy the following into your terminal.

git clone https://github.com/lettier/gifcurry.git
cd gifcurry
stack setup
stack install alex happy
stack install gtk2hs-buildtools
stack install hsc2hs
stack install
$HOME/.local/bin/gifcurry_cli -?
$HOME/.local/bin/gifcurry_gui

What dependencies does Gifcurry use? 🤔

To run Gifcurry. 🏃

To build Gifcurry. 👷

What is the license? 📜

For license information, see LICENSE.

Who wrote Gifcurry? ©️

(C) 2016 David Lettier
lettier.com

More Repositories

1

3d-game-shaders-for-beginners

🎮 A step-by-step guide to implementing SSAO, depth of field, lighting, normal mapping, and more for your 3D game.
C++
16,849
star
2

movie-monad

📺 A free and simple to use video player made with Haskell.
Haskell
419
star
3

lambda-lantern

🧙 ‎‎ A 3D game about functional programming patterns. Uses PureScript Native, C++, and Panda3D.
PureScript
159
star
4

ntpclient

NTP client.
C
130
star
5

webviewhs

🌐 A Haskell binding to the webview library created by Serge Zaitsev.
Haskell
120
star
6

lda-topic-modeling

A PureScript, browser-based implementation of LDA topic modeling.
PureScript
101
star
7

parsing-with-haskell-parser-combinators

🔍 A step-by-step guide to parsing using Haskell parser combinators.
Haskell
87
star
8

interactiveknn

Interactive K-Nearest Neighbors machine learning algorithm in JavaScript.
JavaScript
81
star
9

isosurface

Isosurface extraction using Marching Cubes and pure WebGL.
JavaScript
71
star
10

hacker-feud

💥 A single page web game made with Svelte.
HTML
62
star
11

purescript-pop

😃 A functional reactive programming (FRP) demo created with PureScript events and behaviors.
PureScript
33
star
12

emoji-bingo

😄 A single page web game made with Svelte.
HTML
29
star
13

dnsclient

A simple DNS client similar to nslookup. Does not use any DNS libraries.
Python
26
star
14

blender-keymap-trainer

⌨️ Digital flashcards for memorizing Blender's shortcut keys.
Svelte
25
star
15

webglbowling

A WebGL, browser-based bowling game that uses real-time physics.
JavaScript
24
star
16

lettier.github.io

HTML
21
star
17

interviewquestions

A collection of solutions to various technical interview questions.
Python
18
star
18

interactive-simple-linear-regression

A PureScript, browser-based implementation of simple linear regression.
PureScript
18
star
19

blendersim

Multi-agent robot simulator created with Blender.
Python
17
star
20

slackotron

A plugin extensible Slack bot.
Python
16
star
21

interactivekmeans

Interactive HTML canvas based implementation of k-means.
JavaScript
15
star
22

shortestpath

An interactive HTML5 canvas graph that shows the shortest path between any two nodes.
JavaScript
12
star
23

sierpinski

Explorable 3D Sierpinski tetrahedrons rendered using WebGL.
JavaScript
9
star
24

dubulrubul

Dual-sided, breakout-like 2D game using PhysicsJS, PubSubJS, EaselJS, and FunctionalJS.
JavaScript
8
star
25

poing

Browser based pong clone featuring a neuro-evolved AI opponent.
JavaScript
6
star
26

matrix-inverse-calculator

Input a square matrix and calculate its inverse if possible.
PureScript
5
star
27

bbautotune

Blender/Bullet automatic parameter tuning/learning.
TeX
4
star
28

telnetclientclone

A limited functionality Telnet client clone written in C.
C
3
star
29

boids

Boids steering behaviors created in 3D using the Panda3D API.
Python
3
star
30

webserver

A simple HTTP web server.
Python
3
star
31

wumpusworld

Wumpus World written in Java.
Java
3
star
32

cryptohoppershouter

Two tools for the automation of encrypting files and then later distributing them via email.
Python
3
star
33

simpl

Pong player utilizing a feedforward neural network and evolutionary algorithm.
JavaScript
3
star
34

webclient

A simple web client that retrieves files via HTTP from an HTTP server.
Python
2
star
35

smtpclient

A simple SMTP client that uses either port 25 or 587 with TLS authentication.
Python
2
star
36

chatserver

Simple chat server.
Python
2
star
37

bullytextsms

Code screen for DoSomething.org.
JavaScript
1
star
38

javatrafficlight

Java applet that displays and allows control of a crude traffic light.
Java
1
star
39

lettier.com

Code for the main website.
JavaScript
1
star
40

javaclock

Ticking analog clock made in Java.
Java
1
star
41

javacheckerboard

Java applet of a checker board.
1
star
42

jobjar

A job search web application.
JavaScript
1
star
43

javamancalaboard

Java applet that displays a Mancala board.
Java
1
star