From f860f0770d7de08b62dac02fcd8e19b52b6f849e Mon Sep 17 00:00:00 2001
From: RaPoSpectre <rapospectre@gmail.com>
Date: Sat, 15 Oct 2016 13:04:50 +0800
Subject: [PATCH 1/9] fix issue #334

fix resize video when time changed trigger a error
---
 moviepy/video/VideoClip.py | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/moviepy/video/VideoClip.py b/moviepy/video/VideoClip.py
index bcc6bb2bb..470dd2b16 100644
--- a/moviepy/video/VideoClip.py
+++ b/moviepy/video/VideoClip.py
@@ -516,6 +516,24 @@ def fl_image(self, image_func, apply_to=[]):
     # C O M P O S I T I N G
 
 
+    def fill_array(self, pre_array, shape=(0, 0)):
+        pre_shape = pre_array.shape
+        dx = shape[0] - pre_shape[0]
+        dy = shape[1] - pre_shape[1]
+        post_array = pre_array
+        if dx < 0:
+            post_array = pre_array[:shape[0]]
+        elif dx > 0:
+            x_1 = [[[1, 1, 1]] * pre_shape[1]] * dx
+            post_array = np.vstack((pre_array, x_1))
+        if dy < 0:
+            post_array = post_array[:, :shape[1]]
+        elif dy > 0:
+            x_1 = [[[1, 1, 1]] * dy] * post_array.shape[0]
+            post_array = np.hstack((post_array, x_1))
+        return post_array
+
+
     def blit_on(self, picture, t):
         """
         Returns the result of the blit of the clip's frame at time `t`
@@ -535,6 +553,9 @@ def blit_on(self, picture, t):
         img = self.get_frame(ct)
         mask = (None if (self.mask is None) else
                 self.mask.get_frame(ct))
+        if mask is not None:
+            if (img.shape[0] != mask.shape[0]) or (img.shape[1] != mask.shape[1]):
+                img = self.fill_array(img, mask.shape)
         hi, wi = img.shape[:2]
 
         # SET POSITION

From b035660b1e00636a39e533cb8b1eb372aaaabd0d Mon Sep 17 00:00:00 2001
From: Billy Earney <billy.earney@gmail.com>
Date: Tue, 14 Mar 2017 14:31:12 -0500
Subject: [PATCH 2/9] add scipy for py2.7 on travis-ci

---
 .travis.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.travis.yml b/.travis.yml
index efeaef852..e7bd1590e 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -14,6 +14,7 @@ before_install:
   - mkdir media
 install:   
   - if [[ $TRAVIS_PYTHON_VERSION == '3.4' || $TRAVIS_PYTHON_VERSION == '3.5' || $TRAVIS_PYTHON_VERSION == '3.6' ]]; then pip install matplotlib; pip install -U scikit-learn; pip install scipy; fi
+  - if [[ $TRAVIS_PYTHON_VERSION == '2.7' ]]; then pip install scipy; fi
   - pip install coveralls
   - pip install pytest-cov
   - python setup.py install

From 26ab7dce425416ebff8ab2079c6399bd542e20f9 Mon Sep 17 00:00:00 2001
From: Billy Earney <billy.earney@gmail.com>
Date: Wed, 15 Mar 2017 09:40:20 -0500
Subject: [PATCH 3/9] add tests for ffmeg_parse_infos

---
 moviepy/video/io/ffmpeg_writer.py |  3 +--
 tests/download_media.py           |  3 +++
 tests/test_ffmpeg_reader.py       | 24 ++++++++++++++++++++++++
 tests/test_misc.py                |  8 --------
 4 files changed, 28 insertions(+), 10 deletions(-)
 create mode 100644 tests/test_ffmpeg_reader.py

diff --git a/moviepy/video/io/ffmpeg_writer.py b/moviepy/video/io/ffmpeg_writer.py
index de843f693..03b47a5d3 100644
--- a/moviepy/video/io/ffmpeg_writer.py
+++ b/moviepy/video/io/ffmpeg_writer.py
@@ -135,8 +135,7 @@ def write_frame(self, img_array):
             else:
                self.proc.stdin.write(img_array.tostring())
         except IOError as err:
-            #ffmpeg_error = self.proc.stderr.read()
-            _, ffmpeg_error = self.proc.communicate()
+            ffmpeg_error = self.proc.stderr.read()
             error = (str(err) + ("\n\nMoviePy error: FFMPEG encountered "
                                  "the following error while writing file %s:"
                                  "\n\n %s" % (self.filename, ffmpeg_error)))
diff --git a/tests/download_media.py b/tests/download_media.py
index 248d97441..81cbeb540 100644
--- a/tests/download_media.py
+++ b/tests/download_media.py
@@ -33,3 +33,6 @@ def download():
 
     download_url("https://raw.githubusercontent.com/earney/moviepy_media/master/tests/subtitles/subtitles1.srt",
                  "media/subtitles1.srt")
+
+    download_url("https://github.com/earney/moviepy_media/raw/master/tests/images/pigs_in_a_polka.gif",
+                 "media/pigs_in_a_polka.gif")
diff --git a/tests/test_ffmpeg_reader.py b/tests/test_ffmpeg_reader.py
new file mode 100644
index 000000000..1252701a7
--- /dev/null
+++ b/tests/test_ffmpeg_reader.py
@@ -0,0 +1,24 @@
+import pytest
+from moviepy.editor import *
+
+from moviepy.video.io.ffmpeg_reader import ffmpeg_parse_infos
+
+import sys
+sys.path.append("tests")
+import download_media
+
+def test_download_media(capsys):
+    with capsys.disabled():
+       download_media.download()
+
+def test_ffmpeg_parse_infos():
+    d=ffmpeg_parse_infos("media/big_buck_bunny_432_433.webm")
+    assert d['duration'] == 1.0
+
+    d=ffmpeg_parse_infos("media/pigs_in_a_polka.gif")
+    assert d['video_size']= [314, 273]
+    assert d['duration']= 3.0
+
+
+if __name__ == '__main__':
+   pytest.main()
diff --git a/tests/test_misc.py b/tests/test_misc.py
index 7376166b1..abf19b908 100644
--- a/tests/test_misc.py
+++ b/tests/test_misc.py
@@ -49,14 +49,6 @@ def test_subtitles():
     subtitles = SubtitlesClip(data, generator)
     assert subtitles.subtitles == data
 
-def test_file_to_subtitles():
-    from moviepy.video.tools.subtitles import file_to_subtitles
-
-    data = [([0.0, 4.0], 'Red!'), ([5.0, 9.0], 'More Red!'),
-            ([10.0, 14.0], 'Green!'), ([15.0, 19.0], 'More Green!'),
-            ([20.0, 24.0], 'Blue'), ([25.0, 29.0], 'More Blue!')]
-
-    assert data == file_to_subtitles("media/subtitles1.srt")
 
 if __name__ == '__main__':
    pytest.main()

From 24f3f4710bc31b3a38b67a4ad6e7b1f5d1b7f811 Mon Sep 17 00:00:00 2001
From: Billy Earney <billy.earney@gmail.com>
Date: Wed, 15 Mar 2017 09:43:57 -0500
Subject: [PATCH 4/9] put communicate back in

---
 moviepy/video/io/ffmpeg_writer.py | 2 +-
 tests/test_misc.py                | 9 +++++++++
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/moviepy/video/io/ffmpeg_writer.py b/moviepy/video/io/ffmpeg_writer.py
index 03b47a5d3..54bcc8e99 100644
--- a/moviepy/video/io/ffmpeg_writer.py
+++ b/moviepy/video/io/ffmpeg_writer.py
@@ -135,7 +135,7 @@ def write_frame(self, img_array):
             else:
                self.proc.stdin.write(img_array.tostring())
         except IOError as err:
-            ffmpeg_error = self.proc.stderr.read()
+            _, ffmpeg_error = self.proc.communicate()
             error = (str(err) + ("\n\nMoviePy error: FFMPEG encountered "
                                  "the following error while writing file %s:"
                                  "\n\n %s" % (self.filename, ffmpeg_error)))
diff --git a/tests/test_misc.py b/tests/test_misc.py
index abf19b908..4e989afda 100644
--- a/tests/test_misc.py
+++ b/tests/test_misc.py
@@ -49,6 +49,15 @@ def test_subtitles():
     subtitles = SubtitlesClip(data, generator)
     assert subtitles.subtitles == data
 
+def test_file_to_subtitles():
+    from moviepy.video.tools.subtitles import file_to_subtitles
+
+    data = [([0.0, 4.0], 'Red!'), ([5.0, 9.0], 'More Red!'),
+            ([10.0, 14.0], 'Green!'), ([15.0, 19.0], 'More Green!'),
+            ([20.0, 24.0], 'Blue'), ([25.0, 29.0], 'More Blue!')]
+
+    assert data == file_to_subtitles("media/subtitles1.srt")
+
 
 if __name__ == '__main__':
    pytest.main()

From 4f9709d145c004c6c241464473445ebcd798645e Mon Sep 17 00:00:00 2001
From: Billy Earney <billy.earney@gmail.com>
Date: Wed, 15 Mar 2017 10:04:02 -0500
Subject: [PATCH 5/9] fix syntax error

---
 tests/test_ffmpeg_reader.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tests/test_ffmpeg_reader.py b/tests/test_ffmpeg_reader.py
index 1252701a7..d7ac41d5f 100644
--- a/tests/test_ffmpeg_reader.py
+++ b/tests/test_ffmpeg_reader.py
@@ -16,8 +16,8 @@ def test_ffmpeg_parse_infos():
     assert d['duration'] == 1.0
 
     d=ffmpeg_parse_infos("media/pigs_in_a_polka.gif")
-    assert d['video_size']= [314, 273]
-    assert d['duration']= 3.0
+    assert d['video_size'] == [314, 273]
+    assert d['duration'] == 3.0
 
 
 if __name__ == '__main__':

From 2e9f4600b3ab8848d5e64db78eb3a440cdf096bf Mon Sep 17 00:00:00 2001
From: Billy Earney <billy.earney@gmail.com>
Date: Wed, 15 Mar 2017 10:11:28 -0500
Subject: [PATCH 6/9] Update test_misc.py

---
 tests/test_misc.py | 1 -
 1 file changed, 1 deletion(-)

diff --git a/tests/test_misc.py b/tests/test_misc.py
index 4e989afda..7376166b1 100644
--- a/tests/test_misc.py
+++ b/tests/test_misc.py
@@ -58,6 +58,5 @@ def test_file_to_subtitles():
 
     assert data == file_to_subtitles("media/subtitles1.srt")
 
-
 if __name__ == '__main__':
    pytest.main()

From 6e93d02eccf712c46634c52edad273807b4f3070 Mon Sep 17 00:00:00 2001
From: Billy Earney <billy.earney@gmail.com>
Date: Fri, 7 Apr 2017 08:46:51 -0500
Subject: [PATCH 7/9] add scroll test

---
 tests/download_media.py | 3 +++
 tests/test_issues.py    | 7 +++++++
 2 files changed, 10 insertions(+)

diff --git a/tests/download_media.py b/tests/download_media.py
index fa7f5222a..7b714a223 100644
--- a/tests/download_media.py
+++ b/tests/download_media.py
@@ -45,3 +45,6 @@ def download():
 
     download_url("https://raw.githubusercontent.com/earney/moviepy_media/master/tests/misc/traj.txt",
                  "media/traj.txt")
+
+    download_url("https://github.com/earney/moviepy_media/raw/master/tests/images/vacation_2017.jpg",
+                 "media/vacation_2017.jpg")
diff --git a/tests/test_issues.py b/tests/test_issues.py
index c6237e7e0..305fa66c0 100644
--- a/tests/test_issues.py
+++ b/tests/test_issues.py
@@ -153,5 +153,12 @@ def test_audio_reader():
         subclip.write_audiofile(os.path.join(TMP_DIR, 'issue_246.wav'),
                                 write_logfile=True)
 
+def test_issue_527():
+    clip = ImageClip("media/vacation_2017.jpg")
+    new_clip = vfx.scroll(clip, w=1000, x_speed=50)
+    new_clip = new_clip.set_duration(20)
+    new_clip.fps = 24
+    new_clip.write_videofile(os.path.join(TMP_DIR, "pano.mp4"))
+
 if __name__ == '__main__':
    pytest.main()

From 090fa05bac7115af0846ac89fa2aff2798f5fe56 Mon Sep 17 00:00:00 2001
From: Billy Earney <billy.earney@gmail.com>
Date: Tue, 11 Apr 2017 10:38:41 -0500
Subject: [PATCH 8/9] add test for issue 334; PR 336

---
 tests/download_media.py |  3 +++
 tests/test_issues.py    | 60 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 63 insertions(+)

diff --git a/tests/download_media.py b/tests/download_media.py
index 7b714a223..7fc400e98 100644
--- a/tests/download_media.py
+++ b/tests/download_media.py
@@ -25,6 +25,9 @@ def download():
     download_url("https://github.com/earney/moviepy_media/raw/master/tests/images/afterimage.png",
                  "media/afterimage.png")
 
+    download_url("https://github.com/earney/moviepy_media/blob/master/tests/videos/big_buck_bunny_0_30.webm?raw=true",
+                 "media/big_buck_bunny_0_30.webm")
+
     download_url("https://github.com/earney/moviepy_media/raw/master/tests/videos/big_buck_bunny_432_433.webm",
                  "media/big_buck_bunny_432_433.webm")
 
diff --git a/tests/test_issues.py b/tests/test_issues.py
index 305fa66c0..11e2409d4 100644
--- a/tests/test_issues.py
+++ b/tests/test_issues.py
@@ -29,6 +29,66 @@ def test_issue_285():
     merged_clip = concatenate_videoclips([clip_1, clip_2, clip_3])
     assert merged_clip.duration == 30
 
+
+def test_issue_334():
+    last_move = None
+    last_move1 = None
+
+    lis = [(0.0, 113, 167, 47), (0.32, 138, 159, 47), (0.44, 152, 144, 47), (0.48, 193, 148, 47), (0.6, 193, 148, 47), (0.76, 205, 138, 55), (0.88, 204, 121, 63), (0.92, 190, 31, 127), (1.2, 183, 59, 127), (1.4, 137, 22, 127), (1.52, 137, 22, 127), (1.72, 129, 67, 127), (1.88, 123, 69, 127), (2.04, 131, 123, 63), (2.24, 130, 148, 63), (2.48, 130, 148, 63), (2.8, 138, 180, 63), (3.0, 138, 180, 63), (3.2, 146, 192, 63), (3.28, 105, 91, 151), (3.44, 105, 91, 151), (3.72, 11, 48, 151), (3.96, 5, 78, 151), (4.32, 4, 134, 1), (4.6, 149, 184, 48), (4.8, 145, 188, 48), (5.0, 154, 217, 48), (5.08, 163, 199, 48), (5.2, 163, 199, 48), (5.32, 164, 187, 48), (5.48, 163, 200, 48), (5.76, 163, 200, 48), (5.96, 173, 199, 48), (6.0, 133, 172, 48), (6.04, 128, 165, 48), (6.28, 128, 165, 48), (6.4, 129, 180, 48), (6.52, 133, 166, 48), (6.64, 133, 166, 48), (6.88, 144, 183, 48), (7.0, 153, 174, 48), (7.16, 153, 174, 48), (7.24, 153, 174, 48), (7.28, 253, 65, 104), (7.64, 253, 65, 104), (7.8, 279, 116, 80), (8.0, 290, 105, 80), (8.24, 288, 124, 80), (8.44, 243, 102, 80), (8.56, 243, 102, 80), (8.8, 202, 107, 80), (8.84, 164, 27, 104), (9.0, 164, 27, 104), (9.12, 121, 9, 104), (9.28, 77, 33, 104), (9.32, 52, 23, 104), (9.48, 52, 23, 104), (9.64, 33, 46, 104), (9.8, 93, 49, 104), (9.92, 93, 49, 104), (10.16, 173, 19, 104), (10.2, 226, 173, 48), (10.36, 226, 173, 48), (10.48, 211, 172, 48), (10.64, 208, 162, 48), (10.92, 220, 171, 48)]
+
+    lis1 = [(0.0, 113, 167, 47), (0.32, 138, 159, 47), (0.44, 152, 144, 47), (0.48, 193, 148, 47), (0.6, 193, 148, 47), (0.76, 205, 138, 55), (0.88, 204, 121, 63), (0.92, 190, 31, 127), (1.2, 183, 59, 127), (1.4, 137, 22, 127), (1.52, 137, 22, 127), (1.72, 129, 67, 127), (1.88, 123, 69, 127), (2.04, 131, 123, 63), (2.24, 130, 148, 63), (2.48, 130, 148, 63), (2.8, 138, 180, 63), (3.0, 138, 180, 63), (3.2, 146, 192, 63), (3.28, 105, 91, 151), (3.44, 105, 91, 151), (3.72, 11, 48, 151), (3.96, 5, 78, 151), (4.32, 4, 134, 1), (4.6, 149, 184, 48), (4.8, 145, 188, 48), (5.0, 154, 217, 48), (5.08, 163, 199, 48), (5.2, 163, 199, 48), (5.32, 164, 187, 48), (5.48, 163, 200, 48), (5.76, 163, 200, 48), (5.96, 173, 199, 48), (6.0, 133, 172, 48), (6.04, 128, 165, 48), (6.28, 128, 165, 48), (6.4, 129, 180, 48), (6.52, 133, 166, 48), (6.64, 133, 166, 48), (6.88, 144, 183, 48), (7.0, 153, 174, 48), (7.16, 153, 174, 48), (7.24, 153, 174, 48), (7.28, 253, 65, 104), (7.64, 253, 65, 104), (7.8, 279, 116, 80), (8.0, 290, 105, 80), (8.24, 288, 124, 80), (8.44, 243, 102, 80), (8.56, 243, 102, 80), (8.8, 202, 107, 80), (8.84, 164, 27, 104), (9.0, 164, 27, 104), (9.12, 121, 9, 104), (9.28, 77, 33, 104), (9.32, 52, 23, 104), (9.48, 52, 23, 104), (9.64, 33, 46, 104), (9.8, 93, 49, 104), (9.92, 93, 49, 104), (10.16, 173, 19, 104), (10.2, 226, 173, 48), (10.36, 226, 173, 48), (10.48, 211, 172, 48), (10.64, 208, 162, 48), (10.92, 220, 171, 48)]
+
+
+    def posi(t):
+        global last_move
+        if len(lis) == 0:
+           return (last_move[1], last_move[2])
+        if t >= lis[0][0]:
+           last_move = item = lis.pop(0)
+           return (item[1], item[2])
+        else:
+           if len(lis) > 0:
+              dura = lis[0][0] - last_move[0]
+              now = t - last_move[0]
+              w = (lis[0][1] - last_move[1]) * (now / dura)
+              h = (lis[0][2] - last_move[2]) * (now / dura)
+              # print t, last_move[1] + w, last_move[2] + h
+              return (last_move[1] + w, last_move[2] + h)
+           return (last_move[1], last_move[2])
+
+    def size(t):
+        global last_move1
+        if len(lis1) == 0:
+           return (last_move1[3], last_move1[3] * 1.33)
+        if t >= lis1[0][0]:
+           last_move1 = item = lis1.pop(0)
+           return (item[3], item[3] * 1.33)
+        else:
+           if len(lis) > 0:
+              dura = lis1[0][0] - last_move1[0]
+              now = t - last_move1[0]
+              s = (lis1[0][3] - last_move1[3]) * (now / dura)
+              nsw = last_move1[3] + s
+              nsh = nsw * 1.33
+              # print t, nsw, nsh
+              return (nsw, nsh)
+           return (last_move1[3], last_move1[3] * 1.33)
+
+
+    avatar = VideoFileClip("media/big_buck_bunny_432_433.webm", has_mask=True)
+    avatar.audio=None
+    maskclip = ImageClip("media/afterimage.png", ismask=True, transparent=True)
+    avatar.set_mask(maskclip)  #must set maskclip here..
+
+    avatar = concatenate([avatar]*11)
+
+    tt = VideoFileClip("media/big_buck_bunny_0_30.webm").subclip(0,11)
+    #setting mask here does not work.
+    #final = CompositeVideoClip([tt, avatar.set_position(posi).set_mask(maskclip).resize(size)])
+    final = CompositeVideoClip([tt, avatar.set_position(posi).resize(size)])
+    final.duration = tt.duration
+    final.write_videofile(os.path.join(TMP_DIR, 'issue_334.mp4'), fps=24)
+
 def test_issue_354():
     clip = ImageClip("media/python_logo.png")
 

From 092f3e77376f30bcc4ae044caf5b793402158073 Mon Sep 17 00:00:00 2001
From: Billy Earney <billy.earney@gmail.com>
Date: Tue, 11 Apr 2017 10:42:04 -0500
Subject: [PATCH 9/9] remove issue 527 since another PR solves this

---
 tests/download_media.py | 3 ---
 tests/test_issues.py    | 7 -------
 2 files changed, 10 deletions(-)

diff --git a/tests/download_media.py b/tests/download_media.py
index 7fc400e98..f8ea8ac66 100644
--- a/tests/download_media.py
+++ b/tests/download_media.py
@@ -48,6 +48,3 @@ def download():
 
     download_url("https://raw.githubusercontent.com/earney/moviepy_media/master/tests/misc/traj.txt",
                  "media/traj.txt")
-
-    download_url("https://github.com/earney/moviepy_media/raw/master/tests/images/vacation_2017.jpg",
-                 "media/vacation_2017.jpg")
diff --git a/tests/test_issues.py b/tests/test_issues.py
index 11e2409d4..a854d9c40 100644
--- a/tests/test_issues.py
+++ b/tests/test_issues.py
@@ -213,12 +213,5 @@ def test_audio_reader():
         subclip.write_audiofile(os.path.join(TMP_DIR, 'issue_246.wav'),
                                 write_logfile=True)
 
-def test_issue_527():
-    clip = ImageClip("media/vacation_2017.jpg")
-    new_clip = vfx.scroll(clip, w=1000, x_speed=50)
-    new_clip = new_clip.set_duration(20)
-    new_clip.fps = 24
-    new_clip.write_videofile(os.path.join(TMP_DIR, "pano.mp4"))
-
 if __name__ == '__main__':
    pytest.main()