Browse Source

created content types (and feature)
updated video filter

Bachir Soussi Chiadmi 7 years ago
parent
commit
80df12f80c
41 changed files with 5374 additions and 0 deletions
  1. 14 0
      !
  2. 4 0
      fix-perms
  3. 0 0
      sites/all/modules/contrib/admin/nodeformcols/LICENSE.txt
  4. 339 0
      sites/all/modules/contrib/fields/video_embed_field/LICENSE.txt
  5. BIN
      sites/all/modules/contrib/fields/video_embed_field/img/vimeo.jpg
  6. BIN
      sites/all/modules/contrib/fields/video_embed_field/img/youtube.jpg
  7. 34 0
      sites/all/modules/contrib/fields/video_embed_field/plugins/export_ui/video_embed_field_export_ui.inc
  8. 22 0
      sites/all/modules/contrib/fields/video_embed_field/video-embed-field-embed-code.tpl.php
  9. 5 0
      sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/README.txt
  10. BIN
      sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/img/brightcove.jpg
  11. 14 0
      sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.info
  12. 168 0
      sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.module
  13. BIN
      sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/img/facebook.jpg
  14. 13 0
      sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/video_embed_facebook.info
  15. 156 0
      sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/video_embed_facebook.module
  16. 46 0
      sites/all/modules/contrib/fields/video_embed_field/video_embed_field.admin.inc
  17. 129 0
      sites/all/modules/contrib/fields/video_embed_field/video_embed_field.api.php
  18. 94 0
      sites/all/modules/contrib/fields/video_embed_field/video_embed_field.devel_generate.inc
  19. 73 0
      sites/all/modules/contrib/fields/video_embed_field/video_embed_field.feeds.inc
  20. 560 0
      sites/all/modules/contrib/fields/video_embed_field/video_embed_field.field.inc
  21. 4 0
      sites/all/modules/contrib/fields/video_embed_field/video_embed_field.form.css
  22. 694 0
      sites/all/modules/contrib/fields/video_embed_field/video_embed_field.handlers.inc
  23. 18 0
      sites/all/modules/contrib/fields/video_embed_field/video_embed_field.info
  24. 391 0
      sites/all/modules/contrib/fields/video_embed_field/video_embed_field.install
  25. 57 0
      sites/all/modules/contrib/fields/video_embed_field/video_embed_field.migrate.inc
  26. 722 0
      sites/all/modules/contrib/fields/video_embed_field/video_embed_field.module
  27. 22 0
      sites/all/modules/contrib/fields/video_embed_field/views/handlers/views_embed_field_views_handler_field_thumbnail_path.inc
  28. 72 0
      sites/all/modules/contrib/fields/video_embed_field/views/video_embed_field.views.inc
  29. 0 0
      sites/all/modules/contrib/fields/video_filter_field/LICENSE.txt
  30. 0 0
      sites/all/modules/contrib/fields/video_filter_field/README.txt
  31. 0 0
      sites/all/modules/contrib/fields/video_filter_field/video_filter_field.info
  32. 3 0
      sites/all/modules/contrib/fields/video_filter_field/video_filter_field.module
  33. 299 0
      sites/all/modules/features/clameurs/clameurs.features.field_base.inc
  34. 691 0
      sites/all/modules/features/clameurs/clameurs.features.field_instance.inc
  35. 51 0
      sites/all/modules/features/clameurs/clameurs.features.inc
  36. 21 0
      sites/all/modules/features/clameurs/clameurs.features.taxonomy.inc
  37. 291 0
      sites/all/modules/features/clameurs/clameurs.field_group.inc
  38. 81 0
      sites/all/modules/features/clameurs/clameurs.info
  39. 7 0
      sites/all/modules/features/clameurs/clameurs.module
  40. 64 0
      sites/all/modules/features/clameurs/clameurs.rules_defaults.inc
  41. 215 0
      sites/all/modules/features/clameurs/clameurs.strongarm.inc

+ 14 - 0
!

@@ -0,0 +1,14 @@
+<Virtualhost *:80>
+    DocumentRoot /mnt/Data/bach/Sites/clameurs.org
+    ServerName dev.clameurs.org
+    ServerAdmin bachir@g-u-i.me
+    ErrorLog "/var/log/httpd/clameurs-error_log"
+    CustomLog "/var/log/httpd/clameurs-access_log" common
+    <Directory "/mnt/Data/bach/Sites/clameurs.org">
+      Require all granted
+      Options -FollowSymlinks +Indexes -MultiViews
+      AllowOverride All
+    </Directory>
+</Virtualhost>
+
+

+ 4 - 0
fix-perms

@@ -0,0 +1,4 @@
+#! /bin/bash
+
+sudo chown -R $USER:http sites/all/modules/features/
+sudo chmod -R g+w sites/all/modules/features/

+ 0 - 0
sites/all/modules/contrib/admin/nodeformcols/LICENSE.txt


+ 339 - 0
sites/all/modules/contrib/fields/video_embed_field/LICENSE.txt

@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.

BIN
sites/all/modules/contrib/fields/video_embed_field/img/vimeo.jpg


BIN
sites/all/modules/contrib/fields/video_embed_field/img/youtube.jpg


+ 34 - 0
sites/all/modules/contrib/fields/video_embed_field/plugins/export_ui/video_embed_field_export_ui.inc

@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * @file
+ * Defines the CTools Export UI plugin.
+ */
+
+/**
+ * Defines this Export UI plugin.
+ */
+$plugin = array(
+  'schema' => 'vef_video_styles',
+  'access' => 'administer video styles',
+  // Define the menu item.
+  'menu' => array(
+    'menu prefix' => 'admin/config/media/vef',
+    'menu item' => 'vef_video_styles',
+    'menu title' => 'Video Embed Styles',
+    'menu description' => 'Administer Video Embed Field\'s video styles.',
+  ),
+  // Define user interface texts.
+  'title singular' => t('video style'),
+  'title plural' => t('video styles'),
+  'title singular proper' => t('Video Styles'),
+  'title plural proper' => t('Video Styles'),
+  // Define the names of the functions that provide the add/edit forms.
+  'form' => array(
+    'settings' => 'video_embed_field_video_style_form',
+    // 'submit' and 'validate' are also valid callbacks.
+  ),
+  'export' => array(
+    'admin_title' => 'title',
+  ),
+);

+ 22 - 0
sites/all/modules/contrib/fields/video_embed_field/video-embed-field-embed-code.tpl.php

@@ -0,0 +1,22 @@
+<?php
+/**
+ * @file
+ * Default theme implementation to display a video embed field.
+ *
+ * Variables available:
+ * - $url: The URL of the video to display embed code for
+ * - $style: The style name of the embed code to use
+ * - $style_settings: The style settings for the embed code
+ * - $handler: The name of the video handler
+ * - $embed_code: The embed code
+ * - $data: Additional video data
+ *
+ * @see template_preprocess_video_embed()
+ */
+?>
+
+<div class="embedded-video">
+  <div class="player">
+    <?php print $embed_code; ?>
+  </div>
+</div>

+ 5 - 0
sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/README.txt

@@ -0,0 +1,5 @@
+Brightcove Video Embed Field
+----------------------------
+This module parses a Brightcove URL via the Video Embed Field
+
+Example URL: http://link.brightcove.com/services/player/bcpid3303744435001?bckey=AQ~~,AAAAAGL7jok~,vslbwQw3pdWM_Ya9IsUVNvJJIhV9YG1S&bctid=3118695475001

BIN
sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/img/brightcove.jpg


+ 14 - 0
sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.info

@@ -0,0 +1,14 @@
+name = "Video Embed Brightcove"
+description = "Provides Brightcove handler for Video Embed Fields."
+core = 7.x
+package = Media
+configure = admin/config/media/vef_video_styles
+
+dependencies[] = "video_embed_field"
+
+; Information added by Drupal.org packaging script on 2015-09-07
+version = "7.x-2.0-beta11"
+core = "7.x"
+project = "video_embed_field"
+datestamp = "1441639440"
+

+ 168 - 0
sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.module

@@ -0,0 +1,168 @@
+<?php
+
+/**
+ * @file
+ * Add a handler for brightcove videos to Video Embed Field.
+ * @see video_embed_field.api.php for more documentation.
+ */
+
+/**
+ * Implements hook_video_embed_handler_info().
+ */
+function video_embed_brightcove_video_embed_handler_info() {
+  $handlers = array();
+  $handlers['brightcove'] = array(
+    'title' => 'Brightcove Video',
+    'function' => 'video_embed_brightcove_handle_video',
+    'thumbnail_default' => drupal_get_path('module', 'video_embed_brightcove') . '/img/brightcove.jpg',
+    'form' => 'video_embed_brightcove_form',
+    'form_validate' => 'video_embed_field_handler_brightcove_form_validate',
+    'domains' => array(
+      'brightcove.com',
+      'link.brightcove.com',
+    ),
+    'defaults' => array(
+      'width' => 640,
+      'height' => 360,
+      'class' => '',
+    ),
+  );
+
+  return $handlers;
+}
+
+/**
+ * Form to configure out video settings.
+ *
+ * @param array $defaults
+ *   Values for your provider.
+ *
+ * @return array
+ *   A form as defined by form API.
+ */
+function video_embed_brightcove_form($defaults) {
+  $form = array();
+  // Element for the width of the player.
+  $form['width'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Player Width'),
+    '#description' => t('The width of the player.'),
+    '#default_value' => $defaults['width'],
+  );
+
+  // Element for the height of the player.
+  $form['height'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Player Height'),
+    '#description' => t('The height of the player.'),
+    '#default_value' => $defaults['height'],
+  );
+
+  $form['class'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Player CSS class'),
+    '#description' => t('CSS class to add to the player'),
+    '#default_value' => $defaults['class'],
+  );
+
+  return $form;
+}
+
+/**
+ * Validates the form elements for the Brightcove configuration form.
+ */
+function video_embed_field_handler_brightcove_form_validate($element, &$form_state, $form) {
+  video_embed_field_validate_dimensions($element);
+}
+
+/**
+ * The video handler.
+ *
+ * @param string $url
+ *   The full video url.
+ * @param array $settings
+ *   Handlers settings from the settings form.
+ *
+ * @return array|string
+ *   The embed code for the video.
+ */
+function video_embed_brightcove_handle_video($url, $settings) {
+  $parameters = _video_embed_brightcove_get_video_properties($url);
+
+  if (isset($parameters['id']) && isset($parameters['key'])) {
+    // Embed code.
+    $embed = '<object class="@class" id="myExperience" class="BrightcoveExperience">
+      <param name="bgcolor" value="#FFFFFF" />
+      <param name="width" value="@width" />
+      <param name="height" value="@height" />
+      <param name="playerID" value="!id" />
+      <param name="playerKey" value="!key" />
+      <param name="isVid" value="true" />
+      <param name="isUI" value="true" />
+      <param name="dynamicStreaming" value="true" />
+      <param name="@videoPlayer" value="!videoplayer" />
+    </object>';
+    // Replace our placeholders with the values from the settings.
+    $embed = format_string($embed, array(
+      '!id' => $parameters['id'],
+      '!key' => $parameters['key'],
+      '@width' => $settings['width'],
+      '@height' => $settings['height'],
+      '@class' => $settings['class'],
+      '!videoplayer' => $parameters['player'],
+    ));
+
+    $video = array(
+      '#markup' => $embed,
+      '#suffix' => '<script type="text/javascript">brightcove.createExperiences();</script>',
+      '#attached' => array(
+        'js' => array(
+          '//admin.brightcove.com/js/BrightcoveExperiences.js' => array(
+            'type' => 'external',
+          ),
+        ),
+      ),
+    );
+
+    return $video;
+  }
+  return '';
+}
+
+/**
+ * Helper function to take a brightcove video url and return its id.
+ *
+ * @param string $url
+ *   The full brightcove video url.
+ *
+ * @return array
+ *   The video properties.
+ */
+function _video_embed_brightcove_get_video_properties($url) {
+  // Easy way to break a url into its components.
+  $components = array(
+    'id' => array(
+      'start' => 'bcpid',
+      'finish' => '\?bckey',
+    ),
+    'key' => array(
+      'start' => 'bckey=',
+      'finish' => '&bctid',
+    ),
+    'player' => array(
+      'start' => 'bctid=',
+      'finish' => '',
+    ),
+  );
+
+  $matches = array();
+  $return = array();
+  foreach ($components as $key => $component) {
+    $string = "/(.*){$component['start']}(.*){$component['finish']}/";
+    preg_match($string, $url, $matches);
+    if ($matches && !empty($matches[2])) {
+      $return[$key] = check_plain($matches[2]);
+    }
+  }
+  return $return;
+}

BIN
sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/img/facebook.jpg


+ 13 - 0
sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/video_embed_facebook.info

@@ -0,0 +1,13 @@
+name = "Video Embed Facebook"
+description = "Provides Facebook handler for Video Embed Fields.  This module also serves as an example of how to add handlers to video embed field."
+core = 7.x
+package = Media
+configure = admin/config/media/vef_video_styles
+
+dependencies[] = "video_embed_field"
+; Information added by Drupal.org packaging script on 2015-09-07
+version = "7.x-2.0-beta11"
+core = "7.x"
+project = "video_embed_field"
+datestamp = "1441639440"
+

+ 156 - 0
sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/video_embed_facebook.module

@@ -0,0 +1,156 @@
+<?php
+
+/**
+ * @file
+ * Adds a handler for Facebook videos to Video Embed Field.
+ *
+ * @see video_embed_field.api.php for more documentation
+ */
+
+/**
+ * Implements hook_video_embed_handler_info().
+ */
+function video_embed_facebook_video_embed_handler_info() {
+  $handlers = array();
+  $handlers['facebook'] = array(
+    'title' => 'Facebook Video',
+    'function' => 'video_embed_facebook_handle_video',
+    'thumbnail_function' => 'video_embed_facebook_handle_thumbnail',
+    'thumbnail_default' => drupal_get_path('module', 'video_embed_facebook') . '/img/facebook.jpg',
+    'form' => 'video_embed_facebook_form',
+    'form_validate' => 'video_embed_field_handler_youtube_form_validate',
+    'domains' => array(
+      'facebook.com',
+    ),
+    'defaults' => array(
+      'width' => 640,
+      'height' => 360,
+      'class' => '',
+    ),
+  );
+
+  return $handlers;
+}
+
+/**
+ * Defines the form elements for the Facebook videos configuration form.
+ *
+ * @param array $defaults
+ *   The form default values.
+ *
+ * @return array
+ *   The provider settings form array.
+ */
+function video_embed_facebook_form($defaults) {
+  $form = array();
+
+  $form['width'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Player Width'),
+    '#description' => t('The width of the player.'),
+    '#default_value' => $defaults['width'],
+  );
+
+  $form['height'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Player Height'),
+    '#description' => t('The height of the player.'),
+    '#default_value' => $defaults['height'],
+  );
+
+  $form['class'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Player CSS class'),
+    '#description' => t('CSS class to add to the player'),
+    '#default_value' => $defaults['class'],
+  );
+
+  return $form;
+}
+
+/**
+ * Validates the form elements for the Facebook video configuration form.
+ *
+ * @param array $element
+ *   The form element to validate.
+ * @param array $form_state
+ *   The form to validate state.
+ * @param array $form
+ *   The form to validate structure.
+ */
+function video_embed_field_handler_facebook_form_validate($element, &$form_state, $form) {
+  video_embed_field_validate_dimensions($element);
+}
+
+/**
+ * Handler for Facebook videos.
+ *
+ * @param string $url
+ *   The video URL.
+ * @param array $settings
+ *   The settings array.
+ *
+ * @return string|bool
+ *   The video iframe, or FALSE in case the ID can't be retrieved from the URL.
+ */
+function video_embed_facebook_handle_video($url, $settings) {
+  $id = _video_embed_facebook_get_video_id($url);
+
+  if ($id) {
+    // Our embed code.
+    $embed='<iframe class="@class" src="//www.facebook.com/video/embed?video_id=!id" width="@width" height="@height"></iframe> ';
+    // Use format_string to replace our placeholders with the settings values.
+    $embed = format_string($embed, array(
+      '!id' => $id,
+      '@width' => $settings['width'],
+      '@height' => $settings['height'],
+      '@class' => $settings['class'],
+    ));
+
+    $video = array(
+      '#markup' => $embed,
+    );
+    return $video;
+  }
+
+  return FALSE;
+}
+
+/**
+ * Gets the thumbnail url for Facebook videos.
+ *
+ * @param string $url
+ *   The video URL.
+ *
+ * @return array
+ *   The video thumbnail information.
+ */
+function video_embed_facebook_handle_thumbnail($url) {
+  $id = _video_embed_facebook_get_video_id($url);
+
+  return array(
+    'id' => $id,
+    'url' => 'https://graph.facebook.com/' . $id . '/picture',
+  );
+}
+
+/**
+ * Helper function to get the Facebook video's id.
+ *
+ * @param string $url
+ *   The video URL.
+ *
+ * @return string|bool
+ *   The video ID, or FALSE in case the ID can't be retrieved from the URL.
+ */
+function _video_embed_facebook_get_video_id($url) {
+  // Parse_url is an easy way to break a url into its components.
+  $matches = array();
+  preg_match('/(?:.*)(?:v=|video_id=|videos\/|videos\/v.\.\d+\/)(\d+).*/', $url, $matches);
+  // If the v or video_id get parameters are set, return it.
+  if ($matches && !empty($matches[1])) {
+    return check_plain($matches[1]);
+  }
+  // Otherwise return false.
+  return FALSE;
+}

+ 46 - 0
sites/all/modules/contrib/fields/video_embed_field/video_embed_field.admin.inc

@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * @file
+ * Form builder; Form for editing a video style.
+ *
+ * Used by CTools export ui.
+ */
+
+/**
+ * Video embed style form handler.
+ */
+function video_embed_field_video_style_form(&$form, &$form_state) {
+  if (isset($form_state['item'])) {
+    $style = (array) $form_state['item'];
+  }
+  else {
+    $style = array();
+  }
+  $form_state['video_style'] = $style;
+
+  // Grab the settings off the parser form.
+  $values = isset($style['data']) ? $style['data'] : array();
+  $parser_form = video_embed_field_get_form($values);
+
+  // General settings for playback - formerly in the configuration section.
+  $form['data'] = array(
+    '#type' => 'vertical_tabs',
+    '#title' => t('Playback settings'),
+    '#tree' => TRUE,
+  ) + $parser_form;
+
+  return $form;
+}
+
+/**
+ * VEF settings page form callback.
+ */
+function video_embed_field_settings_form($form, &$form_state) {
+  $form['video_embed_field_youtube_v3_api_key'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Youtube v3 API key'),
+    '#default_value' => variable_get('video_embed_field_youtube_v3_api_key', ''),
+  );
+  return system_settings_form($form);
+}

+ 129 - 0
sites/all/modules/contrib/fields/video_embed_field/video_embed_field.api.php

@@ -0,0 +1,129 @@
+<?php
+
+/**
+ * API Info for video_embed_field module
+ */
+
+/**
+ * @function hook_video_embed_handler_info
+ * Can be used to add more handlers for video_embed_field
+ * @return an array of handlers, each handler is an array with the following
+ * keys:
+ * 'title' : required, the untranslated title of the provider, to show to the
+ *   admin user.
+ * 'function' : required, the function used to generate the embed code.
+ * 'thumbnail_function' : optional, the function used to provide the thumbnail
+ *   for a video.
+ * 'thumbnail_default : optional, the default thumbnail image to display in case
+ *   thumbnail_function does not exist or has no results.
+ * 'data_function' : optional, the function to return an array of video data.
+ * 'form' : required, the function that returns the settings form for your
+ *   provider.
+ * 'form_validate: optional the function that validates the settings form for
+ *   your provider.
+ * 'domains' : required, an array of domains to match against, this is used to
+ *   know which provider to use.
+ * 'defaults' : default values for each setting made configurable in your form
+ *   function.
+ *
+ * @see hook_video_embed_handler_info_alter()
+ * @see below for function definitions
+ */
+function hook_video_embed_handler_info() {
+  $handlers = array();
+
+  $handlers['ustream'] = array(
+    'title' => 'UStream',
+    'function' => 'your_module_handle_ustream',
+    'thumbnail_function' => 'your_module_handle_ustream_thumbnail',
+    'thumbnail_default' => drupal_get_path('module', 'your_module') . '/img/ustream.jpg',
+    'data_function' => 'your_module_handler_ustream_data',
+    'form' => 'your_module_handler_ustream_form',
+    'form_validate' => 'your_module_handler_ustream_form_validate',
+    'domains' => array(
+      'ustream.com',
+    ),
+    'defaults' => array(
+      'width' => 640,
+      'height' => 360,
+    ),
+  );
+
+  return $handlers;
+}
+
+/**
+ * Performs alterations on video_embed_field handlers.
+ *
+ * @param $info
+ *   Array of information on video handlers exposed by
+ *   hook_video_embed_handler_info() implementations.
+ */
+function hook_video_embed_handler_info_alter(&$info) {
+  // Change the thumbnail function for 'ustream' provider.
+  if (isset($info['ustream'])) {
+    $info['ustream']['thumbnail_function'] = 'your_module_handle_ustream_thumbnail_alter';
+  }
+}
+
+/**
+ * Example callbacks for a provider (in this case for ustream).
+ * Obviously, these functions are only for example purposes.
+ */
+
+/**
+ * Generate the embed code for a video
+ * @param $url - the video url as entered by the user
+ * @param $settings - the settings for this provider as defined in the form function,
+ *                      defaulting to your provider's defaults
+ * @return the embed code as a renderable array
+ */
+function your_module_handle_ustream($url, $settings) {
+  return array(
+    //this should be the full embed code for your provider, including each of the settings
+    '#markup' => '<iframe src="ustream"></iframe>',
+  );
+}
+
+/**
+ * Retrieve information about the thumbnail for a given url
+ * @param $url - the url of the video as entered by the user
+ * @return an array with the keys:
+ *   'id' => an id for the video which is unique to your provider, used for naming the cached thumbnail file
+ *   'url' => the url to retrieve the thumbnail from
+ */
+function your_module_handle_ustream_thumbnail($url) {
+  return array(
+    'id' => '12332243242', //generally the id that the provider uses for the video
+    'url' => 'http://something/thumbnail/somthing.jpg', //the url of the thumbnail
+  );
+}
+
+/**
+ * A forms api callback, returns the settings form for the provider
+ * @param $defaults - default/current values for your provider, the currently saved settings
+ *                       with empty values filled with the defaults provided in info hook
+ * @return a form as defined by forms api
+ *
+ * @see http://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7
+ */
+function your_module_handler_ustream_form($defaults) {
+  $form = array();
+
+  $form['width'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Player Width'),
+    '#description' => t('The width of the player in pixels'),
+    '#default_value' => $defaults['width'],
+  );
+
+  return $form;
+}
+
+/**
+ * Return an array of extra data to be stored with the video, this data will be available for theming
+ * @return an array
+ */
+function your_module_handler_ustream_data($url) {
+  return array();
+}

+ 94 - 0
sites/all/modules/contrib/fields/video_embed_field/video_embed_field.devel_generate.inc

@@ -0,0 +1,94 @@
+<?php
+
+/**
+ * @file
+ * Devel generate support for video_embed_field module.
+ */
+
+// The Youtube’s API url.
+define('YT_API_URL', 'http://gdata.youtube.com/feeds/api/videos?q=');
+
+/**
+ * Devel generate plugin definition.
+ */
+function video_embed_field_devel_generate($object, $field, $instance, $bundle) {
+  if (field_behaviors_widget('multiple values', $instance) == FIELD_BEHAVIOR_CUSTOM) {
+    return devel_generate_multiple('_video_embed_field_devel_generate', $object, $field, $instance, $bundle);
+  }
+  else {
+    return _video_embed_field_devel_generate($object, $field, $instance, $bundle);
+  }
+}
+
+/**
+ * Generates a random video_embed_field item.
+ *
+ * @param object $object
+ *   The devel_generate object.
+ * @param array $field
+ *   The field definition.
+ * @param array $instance
+ *   The field instance definition.
+ * @param array $bundle
+ *   The bundle definition.
+ *
+ * @return array
+ *   The video_embed_field item.
+ */
+function _video_embed_field_devel_generate($object, $field, $instance, $bundle) {
+  $video = video_embed_field_retrieve_video();
+  $object_field = array();
+  $object_field['video_url'] = $video['video_url'];
+  if ($instance['settings']['description_field']) {
+    $object_field['description'] = $video['description'];
+  }
+  return $object_field;
+}
+
+/**
+ * Retrieves a random youtube video info from the bunch.
+ *
+ * @return array
+ *   The video definition.
+ */
+function video_embed_field_retrieve_video() {
+  $videos = video_embed_field_generate_videos();
+  return $videos[array_rand($videos)];
+}
+
+/**
+ * Generates a pseudo random bunch of youtube videos.
+ *
+ * @return array
+ *   A bunch of youtube videos.
+ */
+function video_embed_field_generate_videos() {
+  $videos = &drupal_static(__FUNCTION__);
+  if (!isset($videos)) {
+    $videos = array();
+
+    // Create random video seed.
+    $video_id = user_password(2);
+
+    // Using cURL php extension to make the request to youtube API.
+    $ch = curl_init();
+    curl_setopt($ch, CURLOPT_URL, YT_API_URL . $video_id);
+    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+    // $feed holds a rss feed xml returned by youtube API.
+    $feed = curl_exec($ch);
+    curl_close($ch);
+
+    // Using SimpleXML to parse youtube’s feed.
+    $xml = simplexml_load_string($feed);
+    foreach ($xml->entry as $entry) {
+      $videos[] = array(
+        'video_url' => $entry->children('media', TRUE)->group->player->attributes()->url,
+        'description' => $entry->title,
+      );
+    }
+    if (empty($videos)) {
+      video_embed_field_generate_videos();
+    }
+  }
+  return $videos;
+}

+ 73 - 0
sites/all/modules/contrib/fields/video_embed_field/video_embed_field.feeds.inc

@@ -0,0 +1,73 @@
+<?php
+/**
+ * @file
+ * On behalf implementation of Feeds mapping API for video_embed_field.module.
+ */
+
+/**
+ * Implements hook_feeds_processor_targets_alter().
+ *
+ * @see FeedsNodeProcessor::getMappingTargets()
+ */
+function video_embed_field_feeds_processor_targets_alter(&$targets, $entity_type, $bundle_name) {
+  foreach (field_info_instances($entity_type, $bundle_name) as $name => $instance) {
+    $info = field_info_field($name);
+    if ($info['type'] == 'video_embed_field') {
+      $targets[$name . ":video_url"] = array(
+        'name' => t('@name: Embed URL', array('@name' => $instance['label'])),
+        'callback' => 'video_embed_field_set_target',
+        'description' => t('The URL for the @label field of the @entity_type.', array('@entity_type' => $entity_type, '@label' => $instance['label'])),
+        'real_target' => $name,
+      );
+      $targets[$name . ':description'] = array(
+        'name' => t('@name: Embed description', array('@name' => $instance['label'])),
+        'callback' => 'video_embed_field_set_target',
+        'description' => t('The description for the @label field of the @entity_type.', array('@entity_type' => $entity_type, '@label' => $instance['label'])),
+        'real_target' => $name,
+      );
+    }
+  }
+}
+
+/**
+ * Callback for mapping. Here is where the actual mapping happens.
+ *
+ * When the callback is invoked, $target contains the name of the field the
+ * user has decided to map to and $value contains the value of the feed item
+ * element the user has picked as a source.
+ */
+function video_embed_field_set_target($source, $entity, $target, $value) {
+  if (empty($value)) {
+    return;
+  }
+
+  if (!is_array($value)) {
+    $value = array($value);
+  }
+
+  list($field_name, $sub_field) = explode(':', $target, 2);
+
+  $info = field_info_field($field_name);
+
+  // Iterate over all values.
+  $field = isset($entity->$field_name) ? $entity->$field_name : array(LANGUAGE_NONE => array());
+
+  // Allow for multiple mappings to the same target.
+  $count = call_user_func_array('array_merge_recursive', $field[LANGUAGE_NONE]);
+  $delta = count($count[$sub_field]);
+
+  foreach ($value as $v) {
+
+    if ($info['cardinality'] != FIELD_CARDINALITY_UNLIMITED && $info['cardinality'] <= $delta) {
+      break;
+    }
+
+    if (is_scalar($v)) {
+      $field[LANGUAGE_NONE][$delta][$sub_field] = $v;
+
+      $delta++;
+    }
+  }
+
+  $entity->{$field_name} = $field;
+}

+ 560 - 0
sites/all/modules/contrib/fields/video_embed_field/video_embed_field.field.inc

@@ -0,0 +1,560 @@
+<?php
+
+/**
+ * @file
+ * Implement a video field.
+ */
+
+/**
+ * Implements hook_field_info().
+ */
+function video_embed_field_field_info() {
+  return array(
+    'video_embed_field' => array(
+      'label' => 'Video Embed',
+      'description' => 'Embed videos from youtube or vimeo',
+      'settings' => array(),
+      'instance_settings' => array(
+        'description_field' => 0,
+        'description_length' => 128,
+        'allowed_providers' => array_keys(video_embed_get_handlers()),
+      ),
+      'default_widget' => 'video_embed_field_video',
+      'default_formatter' => 'video_embed_field',
+      'property_type' => 'video_embed_field',
+      'property_callbacks' => array('video_embed_field_property_info_callback'),
+    ),
+  );
+}
+
+/**
+ * Property callback for the Entity Metadata framework.
+ */
+function video_embed_field_property_info_callback(&$info, $entity_type, $field, $instance, $field_type) {
+  // Apply the default.
+  entity_metadata_field_default_property_callback($info, $entity_type, $field, $instance, $field_type);
+
+  // Finally add in instance specific property info.
+  $name = $field['field_name'];
+  $property = &$info[$entity_type]['bundles'][$instance['bundle']]['properties'][$name];
+  $property['type'] = ($field['cardinality'] != 1) ? 'list<video_embed_field>' : 'video_embed_field';
+  $property['property info'] = video_embed_field_data_property_info('Video embed');
+  $property['getter callback'] = 'entity_metadata_field_verbatim_get';
+  $property['setter callback'] = 'entity_metadata_field_verbatim_set';
+}
+
+/**
+ * Defines info for the properties of the video_embed_field data structure.
+ */
+function video_embed_field_data_property_info($name = NULL) {
+  // Build an array of basic property information for video_embed_field.
+  $properties = array(
+    'video_url' => array(
+      'label' => 'Video URL',
+      'type' => 'uri',
+      'setter callback' => 'entity_property_verbatim_set',
+    ),
+    'thumbnail_path' => array(
+      'label' => 'Thumbnail path',
+      'type' => 'uri',
+      'getter callback' => 'entity_property_verbatim_get_url',
+    ),
+    'description' => array(
+      'label' => 'Description',
+      'type' => 'text',
+      'setter callback' => 'entity_property_verbatim_set',
+    ),
+  );
+
+  // Add the default values for each of the video_embed_field properties.
+  foreach ($properties as $key => &$value) {
+    $value += array(
+      'description' => !empty($name) ? t('!label of field %name', array('!label' => $value['label'], '%name' => $name)) : '',
+    );
+  }
+
+  return $properties;
+}
+
+/**
+ * Gets the property just as it is set in the data and converts to absolute url.
+ */
+function entity_property_verbatim_get_url($data, array $options, $name, $type, $info) {
+  $property = entity_property_verbatim_get($data, $options, $name, $type, $info);
+  return file_create_url($property);
+}
+
+/**
+ * Implements hook_field_instance_settings_form().
+ */
+function video_embed_field_field_instance_settings_form($field, $instance) {
+  $settings = $instance['settings'];
+
+  $providers = video_embed_get_handlers();
+  $allowed_providers = array();
+  foreach ($providers as $provider_id => $definition) {
+    $allowed_providers[$provider_id] = $definition['title'];
+  }
+
+  $form['allowed_providers'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Select the allowed video providers'),
+    '#options' => $allowed_providers,
+    '#default_value' => isset($settings['allowed_providers']) ? $settings['allowed_providers'] : array(),
+    '#weight' => 10,
+  );
+
+  $form['description_field'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Enable <em>Description</em> field'),
+    '#default_value' => isset($settings['description_field']) ? $settings['description_field'] : '',
+    '#description' => t('The description field allows users to enter a description about the video.'),
+    '#weight' => 11,
+  );
+
+  $form['description_length'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Max description length'),
+    '#default_value' => isset($settings['description_length']) ? $settings['description_length'] : 128,
+    '#weight' => 12,
+    '#size' => 5,
+    '#maxlength' => 5,
+    '#states' => array(
+      'visible' => array(
+        ':input[id="edit-instance-settings-description-field"]' => array('checked' => TRUE),
+      ),
+    ),
+  );
+
+  return $form;
+}
+
+/**
+ * Implements hook_field_widget_info().
+ */
+function video_embed_field_field_widget_info() {
+  return array(
+    'video_embed_field_video' => array(
+      'label' => 'Video',
+      'description' => 'Provides a video embed field',
+      'field types' => array('video_embed_field'),
+      'settings' => array(),
+      'behaviors' => array(
+        'multiple values' => FIELD_BEHAVIOR_DEFAULT,
+        'default value' => FIELD_BEHAVIOR_DEFAULT,
+      ),
+    ),
+  );
+}
+
+/**
+ * Implements hook_field_widget_form().
+ */
+function video_embed_field_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
+  // Don't need to check the type right now because we're only defining one.
+  $element += array(
+    '#type' => 'fieldset',
+  );
+
+  $element['video_url'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Video URL'),
+    '#attributes' => array('class' => array('video_embed_url')),
+    '#attached' => array(
+      'css' => array(
+        drupal_get_path('module', 'video_embed_field') . '/video_embed_field.form.css',
+      ),
+    ),
+    '#default_value' => isset($items[$delta]['video_url']) ? $items[$delta]['video_url'] : '',
+    '#required' => $element['#required'],
+    '#maxlength' => 255,
+  );
+
+  // Add the description field if enabled.
+  if (!empty($instance['settings']['description_field'])) {
+    $element['description'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Description'),
+      '#default_value' => isset($items[$delta]['description']) ? $items[$delta]['description'] : '',
+      '#description' => t('The description which may be used as a label.'),
+      '#maxlength' => $instance['settings']['description_length'],
+    );
+  }
+
+  return $element;
+}
+
+/**
+ * Validates video URL.
+ */
+function video_embed_field_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
+  foreach ($items as $delta => $item) {
+    if (!empty($item['video_url'])) {
+      $item['video_url'] = trim($item['video_url']);
+      if (stristr($item['video_url'], '.') && !stristr($item['video_url'], 'http://') && !stristr($item['video_url'], 'https://')) {
+        $item['video_url'] = 'http://' . $item['video_url'];
+      }
+
+      $parts = parse_url($item['video_url']);
+      if (!$parts || !isset($parts['host'])) {
+        $errors[$field['field_name']][$langcode][$delta][] = array(
+          'error' => t('Invalid Url'),
+          'message' => t('Video: Invalid Video URL.', array('%name' => $instance['label'])),
+        );
+      }
+      else {
+        $host = $parts['host'];
+        if (stripos($host, 'www.') > -1) {
+          $host = substr($host, 4);
+        }
+        $domains = _video_embed_field_get_instance_provider_domains($instance);
+        if (!array_key_exists($host, $domains)) {
+          $errors[$field['field_name']][$langcode][$delta][] = array(
+            'error' => t('Unsupported Video Provider'),
+            'message' => t('%name: This video provider is not currently supported.', array('%name' => $instance['label'])),
+          );
+        }
+      }
+    }
+  }
+}
+
+/**
+ * Implements hook_field_presave().
+ *
+ * Download and save the thumbnail if it hasn't already been stored.
+ * Get video data.
+ */
+function video_embed_field_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) {
+  foreach ($items as $delta => $item) {
+    // Trim whitespace from the video URL.
+    $items[$delta]['video_url'] = trim($item['video_url']);
+
+    // Try to load thumbnail URL.
+    $info = video_embed_field_thumbnail_url($item['video_url']);
+    if (isset($info['url']) && $info['url']) {
+      $thumb_url = $info['url'];
+      $thumb_extension = pathinfo($thumb_url, PATHINFO_EXTENSION);
+      $local_path = "public://video_embed_field_thumbnails/{$info['handler']}/{$info['id']}.$thumb_extension";
+
+      $dirname = drupal_dirname($local_path);
+      file_prepare_directory($dirname, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS);
+
+      $response = drupal_http_request($thumb_url);
+      if (!isset($response->error)) {
+        file_save_data($response->data, $local_path, FILE_EXISTS_REPLACE);
+      }
+      else {
+        @copy($thumb_url, $local_path);
+      }
+
+      $items[$delta]['thumbnail_path'] = $local_path;
+      // Delete any image derivatives at the original image path.
+      image_path_flush($local_path);
+    }
+    // Couldn't get the thumbnail for whatever reason.
+    else {
+      $items[$delta]['thumbnail_path'] = '';
+    }
+
+    // Try to load video data.
+    $data = video_embed_field_get_video_data($item['video_url']);
+    if (is_array($data) && !empty($data)) {
+      $items[$delta]['video_data'] = serialize($data);
+    }
+    else {
+      $items[$delta]['video_data'] = NULL;
+    }
+
+  }
+}
+
+/**
+ * Implements hook_field_is_empty().
+ */
+function video_embed_field_field_is_empty($item, $field) {
+  return empty($item) || empty($item['video_url']) || $item['video_url'] === '';
+}
+
+/**
+ * Implements hook_field_formatter_info().
+ */
+function video_embed_field_field_formatter_info() {
+  $info = array(
+    'video_embed_field' => array(
+      'label' => t('Video Player'),
+      'field types' => array('video_embed_field'),
+      'settings' => array(
+        'video_style' => 'normal',
+        'description' => 1,
+        'description_position' => 'bottom',
+      ),
+    ),
+    'video_embed_field_url' => array(
+      'label' => t('URL to Video'),
+      'field types' => array('video_embed_field'),
+      'settings' => array(),
+    ),
+    'video_embed_field_thumbnail' => array(
+      'label' => t('Thumbnail Preview'),
+      'field types' => array('video_embed_field'),
+      'settings' => array(
+        'image_style' => '',
+        'description' => 1,
+        'description_position' => 'bottom',
+        'image_link' => 'none',
+      ),
+    ),
+  );
+  if (module_exists('colorbox')) {
+    $info['video_embed_field_thumbnail_colorbox'] = array(
+      'label' => t('Thumbnail Preview w/Colorbox'),
+      'field types' => array('video_embed_field'),
+      'settings' => array(
+        'video_style' => 'normal',
+        'image_style' => '',
+        'description' => 1,
+        'description_position' => 'bottom',
+      ),
+    );
+    $info['video_embed_field_url_colorbox'] = array(
+      'label' => t('URL to Video w/Colorbox'),
+      'field types' => array('video_embed_field'),
+      'settings' => array(
+        'video_style' => 'normal',
+      ),
+    );
+  }
+  return $info;
+}
+
+/**
+ * Implements hook_field_formatter_settings_form().
+ */
+function video_embed_field_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+  $element = array();
+
+  if ($display['type'] == 'video_embed_field' || $display['type'] == 'video_embed_field_thumbnail_colorbox' || $display['type'] == 'video_embed_field_url_colorbox') {
+    $video_styles = video_embed_field_video_style_options(FALSE);
+    $element['video_style'] = array(
+      '#title' => t('Video style'),
+      '#type' => 'select',
+      '#default_value' => $settings['video_style'],
+      '#options' => $video_styles,
+    );
+  }
+  if ($display['type'] == 'video_embed_field_thumbnail' || $display['type'] == 'video_embed_field_thumbnail_colorbox') {
+    $element['image_style'] = array(
+      '#title' => t('Image style'),
+      '#type' => 'select',
+      '#options' => image_style_options(FALSE),
+      '#default_value' => $settings['image_style'],
+      '#empty_option' => t('None (original image)'),
+    );
+  }
+
+  if ($display['type'] == 'video_embed_field_thumbnail') {
+    $link_types = array(
+      'content' => t('Content'),
+      'source' => t('Video Source'),
+    );
+    $element['image_link'] = array(
+      '#title' => t('Link thumbnail to'),
+      '#type' => 'select',
+      '#default_value' => $settings['image_link'],
+      '#empty_option' => t('Nothing'),
+      '#options' => $link_types,
+    );
+  }
+
+  if ($instance['settings']['description_field'] && $display['type'] != 'video_embed_field_url' && $display['type'] != 'video_embed_field_url_colorbox') {
+    $element['description'] = array(
+      '#title' => t('Show description'),
+      '#type' => 'checkbox',
+      '#default_value' => $settings['description'],
+    );
+
+    $element['description_position'] = array(
+      '#title' => t('Description Position'),
+      '#type' => 'select',
+      '#options' => array(
+        'top' => t('Top'),
+        'bottom' => t('Bottom'),
+      ),
+      '#default_value' => $settings['description_position'],
+      '#states' => array(
+        'visible' => array(
+          ':input[name="fields[' . $field['field_name'] . '][settings_edit_form][settings][description]"]' => array('checked' => TRUE),
+        ),
+      ),
+    );
+  }
+  return $element;
+}
+/**
+ * Implements hook_field_formatter_settings_summary().
+ */
+function video_embed_field_field_formatter_settings_summary($field, $instance, $view_mode) {
+  $display = $instance['display'][$view_mode];
+  $settings = $display['settings'];
+
+  $summary = array();
+  if ($display['type'] == 'video_embed_field' || $display['type'] == 'video_embed_field_thumbnail_colorbox' || $display['type'] == 'video_embed_field_url_colorbox') {
+    $video_styles = video_embed_field_video_style_options(FALSE);
+    // Styles could be lost because of enabled/disabled modules that defines
+    // their styles in code.
+    if (isset($video_styles[$settings['video_style']])) {
+      $summary[] = t('Video style: @style', array('@style' => $video_styles[$settings['video_style']]));
+    }
+  }
+  if ($display['type'] == 'video_embed_field_thumbnail' || $display['type'] == 'video_embed_field_thumbnail_colorbox') {
+    $image_styles = image_style_options(FALSE);
+    if (isset($image_styles[$settings['image_style']])) {
+      $summary[] = t('Image style: @style', array('@style' => $image_styles[$settings['image_style']]));
+    }
+    // No Image style (original image).
+    else {
+      $summary[] = t('Original Image.');
+    }
+    if (isset($settings['image_link'])) {
+      $summary[] = t('Image link: @image_link', array('@image_link' => $settings['image_link']));
+    }
+    else {
+      $summary[] = t('Image link: none');
+    }
+  }
+
+  if (isset($settings['description'])) {
+    if ($settings['description'] && $instance['settings']['description_field']) {
+      $summary[] = t('Show description');
+    }
+    elseif ($instance['settings']['description_field']) {
+      $summary[] = t('Hide description');
+    }
+  }
+
+  return implode('<br />', $summary);
+}
+
+/**
+ * Implements hook_field_formatter_view().
+ */
+function video_embed_field_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
+  $element = array();
+  $settings = $display['settings'];
+
+  if ($display['type'] == 'video_embed_field_thumbnail' && $display['settings']['image_link'] == 'content') {
+    $path = entity_uri($entity_type, $entity);
+  }
+
+  foreach ($items as $delta => $item) {
+    // Create the render array for the description.
+    if (isset($item['description']) && $item['description'] && $settings['description'] && $instance['settings']['description_field']) {
+      $description = array(
+        '#prefix' => '<div class="video-embed-description">',
+        '#markup' => check_plain($item['description']),
+        '#suffix' => '</div>',
+      );
+      $alt = $item['description'];
+    }
+    else {
+      $description = array();
+      $alt = '';
+    }
+
+    // Render the field.
+    if ($display['type'] == 'video_embed_field') {
+      $element[$delta] = array(
+        array(
+          '#theme' => 'video_embed_field_embed_code',
+          '#url' => $item['video_url'],
+          '#style' => $settings['video_style'],
+          '#video_data' => !empty($item['video_data']) ? unserialize($item['video_data']) : array(),
+        ),
+      );
+    }
+    elseif ($display['type'] == 'video_embed_field_url') {
+      $element[$delta] = array(
+        array(
+          '#markup' => url($item['video_url']),
+        ),
+      );
+    }
+    elseif ($display['type'] == 'video_embed_field_thumbnail') {
+      if (isset($item['thumbnail_path'])) {
+        if ($display['settings']['image_link'] == 'source') {
+          if ($ret = parse_url($item['video_url'])) {
+            if (!isset($ret["scheme"])) {
+              $item['video_url'] = "http://{$item['video_url']}";
+            }
+          }
+          $path = array(
+            'path' => $item['video_url'],
+            'options' => array(),
+          );
+        }
+
+        $element[$delta] = array(
+          '#theme' => 'image_formatter',
+          '#item' => array('uri' => $item['thumbnail_path'], 'alt' => $alt),
+          '#image_style' => $display['settings']['image_style'],
+          '#path' => isset($path) ? $path : '',
+        );
+      }
+      // Incase no thumbnail was downloaded/provider doesn't support thumbnails.
+      else {
+        $element[$delta] = array();
+      }
+    }
+    elseif ($display['type'] == 'video_embed_field_thumbnail_colorbox') {
+      if (isset($item['thumbnail_path'])) {
+        if ($ret = parse_url($item['video_url'])) {
+          if (!isset($ret["scheme"])) {
+            $item['video_url'] = "http://{$item['video_url']}";
+          }
+        }
+        $element[$delta] = array(
+          array(
+            '#theme' => 'video_embed_field_colorbox_code',
+            '#image_url' => $item['thumbnail_path'],
+            '#image_style' => $display['settings']['image_style'],
+            '#image_alt' => $alt,
+            '#video_url' => $item['video_url'],
+            '#video_style' => $display['settings']['video_style'],
+            '#video_data' => unserialize($item['video_data']),
+          ),
+        );
+      }
+      // Incase no thumbnail was downloaded/provider doesn't support thumbnails.
+      else {
+        $element[$delta] = array();
+      }
+    }
+    elseif ($display['type'] == 'video_embed_field_url_colorbox') {
+      $path = video_embed_field_get_ajax_url($item['video_url'], $display['settings']['video_style']);
+
+      $element[$delta] = array(
+        array(
+          '#markup' => url($path['path'], $path['options']),
+        ),
+      );
+    }
+    // Get the HTML instead of the array, because we append it to the suffix.
+    // This way, the thumbnail link doesn't make the description a link as well.
+    $description_html = drupal_render($description);
+
+    $pos = isset($settings['description_position']) ? $settings['description_position'] : 'bottom';
+    if ($pos == 'top') {
+      $element[$delta]['#prefix'] = isset($element[$delta]['#prefix']) ? $element[$delta]['#prefix'] : '';
+      $element[$delta]['#prefix'] = $description_html . $element[$delta]['#prefix'];
+    }
+    else {
+      $element[$delta]['#suffix'] = isset($element[$delta]['#suffix']) ? $element[$delta]['#suffix'] : '';
+      $element[$delta]['#suffix'] .= $description_html;
+    }
+  }
+
+  return $element;
+}

+ 4 - 0
sites/all/modules/contrib/fields/video_embed_field/video_embed_field.form.css

@@ -0,0 +1,4 @@
+/* Style to make sure the fields are the right way */
+table input.fluid.video_embed_url {
+	width:100%;
+}

+ 694 - 0
sites/all/modules/contrib/fields/video_embed_field/video_embed_field.handlers.inc

@@ -0,0 +1,694 @@
+<?php
+
+/**
+ * @file
+ * Provide some handlers for video embed field
+ * Other modules can implement the hook_video_embed_handler_info to provide more
+ * handlers.
+ */
+
+
+/**
+ * Implements hook_video_embed_handler_info().
+ */
+function video_embed_field_video_embed_handler_info() {
+  $handlers = array();
+
+  $handlers['youtube'] = array(
+    'title' => 'Youtube',
+    'function' => 'video_embed_field_handle_youtube',
+    'thumbnail_function' => 'video_embed_field_handle_youtube_thumbnail',
+    'thumbnail_default' => drupal_get_path('module', 'video_embed_field') . '/img/youtube.jpg',
+    'data_function' => 'video_embed_field_handle_youtube_data',
+    'form' => 'video_embed_field_handler_youtube_form',
+    'form_validate' => 'video_embed_field_handler_youtube_form_validate',
+    'domains' => array(
+      'youtube.com',
+      'youtu.be',
+    ),
+    'defaults' => array(
+      'width' => 640,
+      'height' => 360,
+      'autoplay' => 0,
+      'vq' => 'large',
+      'rel' => 0,
+      'controls' => 1,
+      'autohide' => 2,
+      'showinfo' => 1,
+      'modestbranding' => 0,
+      'theme' => 'dark',
+      'iv_load_policy' => 1,
+      'class' => '',
+    ),
+  );
+
+  $handlers['vimeo'] = array(
+    'title' => 'Vimeo',
+    'function' => 'video_embed_field_handle_vimeo',
+    'thumbnail_function' => 'video_embed_field_handle_vimeo_thumbnail',
+    'thumbnail_default' => drupal_get_path('module', 'video_embed_field') . '/img/vimeo.jpg',
+    'data_function' => '_video_embed_field_get_vimeo_data',
+    'form' => 'video_embed_field_handler_vimeo_form',
+    'form_validate' => 'video_embed_field_handler_vimeo_form_validate',
+    'domains' => array(
+      'vimeo.com',
+    ),
+    'defaults' => array(
+      'width' => 640,
+      'height' => 360,
+      'color' => '00adef',
+      'portrait' => 1,
+      'title' => 1,
+      'byline' => 1,
+      'autoplay' => 0,
+      'loop' => 0,
+      'froogaloop' => 0,
+      'class' => ''
+    ),
+  );
+
+  return $handlers;
+}
+
+/**
+ * Helper function to get the youtube video's id.
+ *
+ * @param string $url
+ *   The video URL.
+ *
+ * @return string|bool
+ *   The video ID, or FALSE in case the ID can't be retrieved from the URL.
+ */
+function _video_embed_field_get_youtube_id($url) {
+  // Find the ID of the video they want to play from the url.
+  if (stristr($url, 'http://')) {
+    $url = substr($url, 7);
+  }
+  elseif (stristr($url, 'https://')) {
+    $url = substr($url, 8);
+  }
+
+  if (stristr($url, 'playlist')) {
+    // Playlists need the appended ampersand to take the options properly.
+    $url = $url . '&';
+    $pos = strripos($url, '?list=');
+    if ($pos !== FALSE) {
+      $pos2 = stripos($url, '&');
+      $pos2++;
+    }
+    else {
+      return FALSE;
+    }
+  }
+  // Alternate playlist link.
+  elseif (stristr($url, 'view_play_list')) {
+    $url = $url . '&';
+    // All playlist ID's are prepended with PL.
+    if (!stristr($url, '?p=PL')) {
+      $url = substr_replace($url, 'PL', strpos($url, '?p=') + 3, 0);
+    }
+    // Replace the links format with the embed format.
+    $url = str_ireplace('play_list?p=', 'videoseries?list=', $url);
+    $pos = strripos($url, 'videoseries?list=');
+    if ($pos !== FALSE) {
+      $pos2 = stripos($url, '&');
+      $pos2++;
+    }
+    else {
+      return FALSE;
+    }
+  }
+  else {
+    $pos = strripos($url, 'v=');
+    if ($pos !== FALSE) {
+      $pos += 2;
+      $pos2 = stripos($url, '&', $pos);
+      $pos_hash = stripos($url, '#', $pos);
+
+      $pos2 = _video_embed_get_min($pos2, $pos_hash);
+    }
+    else {
+      $pos = strripos($url, '/');
+      if ($pos !== FALSE) {
+        $pos++;
+        $pos2 = stripos($url, '?', $pos);
+        $pos_hash = stripos($url, '#', $pos);
+
+        $pos2 = _video_embed_get_min($pos2, $pos_hash);
+      }
+    }
+  }
+  if ($pos === FALSE) {
+    return FALSE;
+  }
+  else {
+    if ($pos2 > 0) {
+      $id = substr($url, $pos, $pos2 - $pos);
+    }
+    else {
+      $id = substr($url, $pos);
+    }
+  }
+  return check_plain($id);
+}
+
+/**
+ * Handler for Youtube videos.
+ *
+ * @param string $url
+ *   The video URL.
+ * @param array $settings
+ *   The settings array.
+ *
+ * @return array
+ *   The video iframe render array.
+ */
+function video_embed_field_handle_youtube($url, $settings) {
+  $output = array();
+
+  if(preg_match('/#t=((?P<min>\d+)m)?((?P<sec>\d+)s)?((?P<tinsec>\d+))?/', $url, $matches)){
+    if(isset($matches['tinsec'])){
+      $settings['start'] = $matches['tinsec']; // url already in form #t=125 for 2 minutes and 5 seconds
+    } else {
+      // url in form #t=2m5s or with other useless data, this is why we still keep adding the default data..
+      // give it some default data in case there is no #t=...
+      $matches += array(
+        "min" => 0,
+        "sec" => 0,
+      );
+      if ($time = ($matches["min"] * 60) + $matches["sec"]) {
+        $settings['start'] = $time;
+      }
+    }
+  }
+
+  $id = _video_embed_field_get_youtube_id($url);
+  if (!$id) {
+    // We can't decode the URL - just return the URL as a link.
+    $output['#markup'] = l($url, $url);
+    return $output;
+  }
+
+  // Add class to variable to avoid adding it to URL param string.
+  $class = $settings['class'];
+  unset($settings['class']);
+
+  // Construct the embed code.
+  $settings['wmode'] = 'opaque';
+  $settings_str = urlencode(_video_embed_code_get_settings_str($settings));
+
+  $output['#markup'] = '<iframe class="' . check_plain($class) . '" width="' . check_plain($settings['width']) . '" height="' . check_plain($settings['height']) . '" src="//www.youtube.com/embed/' . $id . '?' . $settings_str . '" frameborder="0" allowfullscreen></iframe>';
+
+  return $output;
+}
+
+/**
+ * Gets the thumbnail url for youtube videos.
+ *
+ * @param string $url
+ *   The video URL.
+ *
+ * @return array
+ *   The video thumbnail information.
+ */
+function video_embed_field_handle_youtube_thumbnail($url) {
+  $info = array();
+
+  $id = _video_embed_field_get_youtube_id($url);
+
+  // Playlist.
+  if (stristr($id, '?list=')) {
+    // Strip out all but the ID, including the PL behind the ID.
+    $start = strpos($id, '?list=PL') + 8;
+    $length = strpos($id, '&') - $start;
+    $id = substr($id, $start, $length);
+    $info['id'] = $id;
+    // Playlist info is stored in XML. The thumbnail is in there.
+    $xml = drupal_http_request('http://gdata.youtube.com/feeds/api/playlists/' . $id);
+    if (!isset($xml->error)) {
+      $xml = new SimpleXMLElement($xml->data);
+      $media = $xml->children('http://search.yahoo.com/mrss/');
+      if ($media->group->thumbnail && $media->group->thumbnail[0]->attributes()) {
+        $attrs = $media->group->thumbnail[0]->attributes();
+        $info['url'] = (string) $attrs['url'];
+      }
+    }
+  }
+  // Regular video.
+  elseif ($id) {
+    $info['id'] = $id;
+    $info['url'] = 'http://img.youtube.com/vi/' . $id . '/0.jpg';
+  }
+  return $info;
+}
+
+/**
+ * Gets video data for a YouTube video URL.
+ *
+ * @param string $url
+ *   A YouTube video URL to get data for
+ *
+ * @return array|bool
+ *   An array of video data, or FALSE if unable to fetch data
+ */
+function video_embed_field_handle_youtube_data($url) {
+  // Get YouTube video ID from URL.
+  $id = _video_embed_field_get_youtube_id($url);
+
+  if ($id) {
+
+    $options['v'] = 3;
+    $options['key'] = variable_get('video_embed_field_youtube_v3_api_key', '');
+    $options['part'] = 'snippet';
+    $options['id'] = $id;
+
+    $response = drupal_http_request(url('https://www.googleapis.com/youtube/v3/videos', array('query' => $options)));
+
+    if (!isset($response->error)) {
+      $data = json_decode($response->data);
+      return _video_embed_field_clean_up_youtube_data($data->items);
+    }
+  }
+
+  return FALSE;
+}
+
+/**
+ * Flattens out some unnecessary nesting in the youtube data.
+ *
+ * @param array $data
+ *   The unflattened data.
+ *
+ * @return array
+ *   The flattened data.
+ */
+function _video_embed_field_clean_up_youtube_data($data) {
+  // Make things a bit nicer for people trying to use the data.
+  foreach ($data as $key => $value) {
+    if (is_object($value)) {
+      $temp = (array) $value;
+      if (isset($temp['$t'])) {
+        $data[$key] = $temp['$t'];
+      }
+      else {
+        $data[$key] = _video_embed_field_clean_up_youtube_data($temp);
+      }
+    }
+    elseif (is_array($value)) {
+      $data[$key] = _video_embed_field_clean_up_youtube_data($value);
+    }
+
+    if ($key === 'category') {
+      $terms = array();
+      foreach ($data[$key] as $value) {
+        if (isset($value['scheme']) && $value['scheme'] == 'http://schemas.google.com/g/2005#kind') {
+          continue;
+        }
+
+        if (isset($value['term'])) {
+          $terms[] = $value['term'];
+        }
+      }
+      $data['terms'] = $terms;
+    }
+  }
+  return $data;
+}
+
+/**
+ * Defines the form elements for the Youtube configuration form.
+ *
+ * @param array $defaults
+ *   The form default values.
+ *
+ * @return array
+ *   The provider settings form array.
+ */
+function video_embed_field_handler_youtube_form($defaults) {
+  $form = array();
+
+  $form['width'] = array(
+    '#type' => 'textfield',
+    '#size' => '5',
+    '#title' => t('Player Width'),
+    '#description' => t('The width of the youtube player.'),
+    '#default_value' => $defaults['width'],
+  );
+  $form['height'] = array(
+    '#type' => 'textfield',
+    '#size' => '5',
+    '#title' => t('Player Height'),
+    '#description' => t('The height of the youtube player.'),
+    '#default_value' => $defaults['height'],
+  );
+  $form['theme'] = array(
+    '#type' => 'select',
+    '#options' => array(
+      'dark' => t('Dark'),
+      'light' => t('Light'),
+    ),
+    '#title' => t('Player theme'),
+    '#default_value' => $defaults['theme'],
+  );
+  $form['autoplay'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Autoplay'),
+    '#description' => t('Play the video immediately.'),
+    '#default_value' => $defaults['autoplay'],
+  );
+  $form['vq'] = array(
+    '#type' => 'select',
+    '#title' => t('Video quality'),
+    '#options' => array(
+      'small' => t('Small (240p)'),
+      'medium' => t('Medium (360p)'),
+      'large' => t('Large (480p)'),
+      'hd720' => t('HD 720p'),
+      'hd1080' => t('HD 10800p'),
+    ),
+    '#default_value' => $defaults['vq'],
+    '#description' => t('Attempt to play the video in certain quality if available.'),
+  );
+  $form['rel'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Show related videos'),
+    '#description' => t('Show related videos after the video is finished playing.'),
+    '#default_value' => $defaults['rel'],
+  );
+  $form['showinfo'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Show info'),
+    '#description' => t('Display information like the video title and rating before the video starts playing.'),
+    '#default_value' => $defaults['showinfo'],
+  );
+  $form['modestbranding'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Hide Youtube logo'),
+    '#description' => t('Hide the Youtube logo button on the player'),
+    '#default_value' => $defaults['modestbranding'],
+  );
+  $form['iv_load_policy'] = array(
+    '#type' => 'radios',
+    '#options' => array(
+      1 => t('Show video annotations.'),
+      3 => t('Hide video annotations.'),
+    ),
+    '#title' => t('Display annotations'),
+    '#description' => t('Controls the display of annotations over the video content. Only works when using the flash player.'),
+    '#default_value' => $defaults['iv_load_policy'],
+  );
+  $form['controls'] = array(
+    '#type' => 'radios',
+    '#options' => array(
+      0 => t('Hide video controls.'),
+      1 => t('Show video controls. Youtube default.'),
+      2 => t('Show video controls with performance improvement for iframe embeds.'),
+    ),
+    '#title' => t('Display Youtube player controls'),
+    '#description' => t('This parameter indicates whether the video player controls will display.'),
+    '#default_value' => $defaults['controls'],
+  );
+  $form['autohide'] = array(
+    '#type' => 'radios',
+    '#options' => array(
+      0 => t('The video progress bar and player controls will be visible throughout the video.'),
+      1 => t('Automatically slide the video progress bar and the player controls out of view a couple of seconds after the video starts playing. They will only reappear if the user moves her mouse over the video player or presses a keyboard key.'),
+      2 => t('The video progress bar will fade out but the player controls (play button, volume control, etc.) remain visible.'),
+    ),
+    '#title' => t('Autohide progress bar and the player controls'),
+    '#description' => t('Controls the autohide behavior of the youtube player controls.'),
+    '#default_value' => $defaults['autohide'],
+  );
+
+  $form['class'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Player CSS class'),
+    '#description' => t('CSS class to add to the player'),
+    '#default_value' => $defaults['class'],
+  );
+
+  return $form;
+}
+
+/**
+ * Validates the form elements for the Youtube configuration form.
+ *
+ * @param array $element
+ *   The form element to validate.
+ * @param array $form_state
+ *   The form to validate state.
+ * @param array $form
+ *   The form to validate structure.
+ */
+function video_embed_field_handler_youtube_form_validate($element, &$form_state, $form) {
+  video_embed_field_validate_dimensions($element);
+}
+
+/**
+ * Helper function to get the Vimeo video's data attributes.
+ *
+ * @param string $url
+ *   A Vimeo video URL to get the data from.
+ *
+ * @return integer|false
+ *   The video's data attributes, or FALSE if unable to get the video ID.
+ */
+function _video_embed_field_get_vimeo_data($url) {
+  // Set oembed endpoint
+  $oembed_endpoint = 'http://vimeo.com/api/oembed';
+  // Fetch vimeo data
+  $response = drupal_http_request($oembed_endpoint . '.json?url=' . rawurlencode($url));
+
+  try {
+    return json_decode($response->data, TRUE);
+  } catch (Exception $e) {
+    return FALSE;
+  }
+}
+
+/**
+ * Helper function to get the Vimeo video's data attributes.
+ *
+ * @param string $url
+ *   A Vimeo video URL to get the ID of.
+ *
+ * @return integer|false
+ *   The video ID, or FALSE if unable to get the video ID.
+ */
+function _video_embed_field_get_vimeo_id($vimeo_data) {
+  try {
+    $video_id = $vimeo_data['video_id'];
+  } catch (Exception $e) {
+    $video_id = FALSE;
+  }
+
+  return $video_id;
+}
+
+/**
+ * Handler for Vimeo videos.
+ *
+ * @param string $url
+ *   The video URL.
+ * @param array $settings
+ *   The settings array.
+ *
+ * @return string
+ *   The video iframe.
+ */
+function video_embed_field_handle_vimeo($url, $settings) {
+  $vimeo_data = _video_embed_field_get_vimeo_data($url);
+
+  // Get ID of video from URL.
+  $id = _video_embed_field_get_vimeo_id($vimeo_data);
+
+  if (empty($id)) {
+    return array(
+      '#markup' => l($url, $url),
+    );
+  }
+
+  // Construct the embed code.
+  $settings['player_id'] = drupal_html_id('vimeo-' . $id);
+  if (!empty($settings['froogaloop'])) {
+    $settings['api'] = 1;
+  }
+  unset($settings['froogaloop']);
+
+  // Add class to variable to avoid adding it to URL param string.
+  $class = $settings['class'];
+  unset($settings['class']);
+
+  $settings_str = _video_embed_code_get_settings_str($settings);
+
+  return array(
+    '#markup' => '<iframe class="' . check_plain($class) . '" id="' . $settings['player_id'] . '" width="' . check_plain($settings['width']) . '" height="' . check_plain($settings['height']) . '" src="//player.vimeo.com/video/' . $id .
+    '?' . $settings_str . '" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowfullscreen></iframe>',
+  );
+}
+
+/**
+ * Gets the thumbnail url for vimeo videos.
+ *
+ * @param string $url
+ *   The video URL.
+ *
+ * @return array
+ *   The video thumbnail information.
+ */
+function video_embed_field_handle_vimeo_thumbnail($url) {
+  $vimeo_data = _video_embed_field_get_vimeo_data($url);
+
+  // Get ID of video from URL.
+  $id = _video_embed_field_get_vimeo_id($vimeo_data);
+
+  $info = array(
+    'id' => $id,
+  );
+
+  try {
+    $info['url'] = $vimeo_data['thumbnail_url'];
+  } catch (Exception $e) {
+
+  }
+
+  return $info;
+}
+
+/**
+ * Defines the form elements for the Vimeo configuration form.
+ *
+ * @param array $defaults
+ *   The form default values.
+ *
+ * @return array
+ *   The provider settings form array.
+ */
+function video_embed_field_handler_vimeo_form($defaults) {
+  $form = array();
+
+  $form['width'] = array(
+    '#type' => 'textfield',
+    '#size' => '5',
+    '#title' => t('Player Width'),
+    '#description' => t('The width of the vimeo player.'),
+    '#default_value' => $defaults['width'],
+  );
+
+  $form['height'] = array(
+    '#type' => 'textfield',
+    '#size' => '5',
+    '#title' => t('Player Height'),
+    '#description' => t('The height of the vimeo player.'),
+    '#default_value' => $defaults['height'],
+  );
+
+  $form['color'] = array(
+    '#type' => 'select',
+    '#options' => array(
+      '00adef' => t('Blue'),
+      'ff9933' => t('Orange'),
+      'c9ff23' => t('Lime'),
+      'ff0179' => t('Fuschia'),
+      'ffffff' => t('White'),
+    ),
+    '#title' => t('Player Color'),
+    '#description' => t('The color to use on the vimeo player.'),
+    '#default_value' => $defaults['color'],
+  );
+
+  $form['portrait'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Overlay Author Thumbnail'),
+    '#description' => t("Overlay the author's thumbnail before the video is played."),
+    '#default_value' => $defaults['portrait'],
+  );
+
+  $form['title'] = array(
+    '#type' => 'checkbox',
+    '#title' => t("Overlay Video's Title"),
+    '#description' => t("Overlay the video's title before the video is played."),
+    '#default_value' => $defaults['title'],
+  );
+
+  $form['byline'] = array(
+    '#type' => 'checkbox',
+    '#title' => t("Overlay Video's Byline"),
+    '#description' => t("Overlay the video's description before the video is played."),
+    '#default_value' => $defaults['byline'],
+  );
+
+  $form['overridable'] = array(
+    '#prefix' => '<p class="note"><strong>' . t('Note') . ': </strong><em>',
+    '#markup' => t('Color, portrait, title and byline can be restricted by Vimeo Plus videos.
+      Such videos will ignore these settings.'),
+    '#suffix' => '</em></p>',
+  );
+
+  $form['autoplay'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Autoplay'),
+    '#description' => t('Play the video immediately.'),
+    '#default_value' => $defaults['autoplay'],
+  );
+
+  $form['loop'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Loop'),
+    '#description' => t("Loop the video's playback"),
+    '#default_value' => $defaults['loop'],
+  );
+
+  $form['froogaloop'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Enable froogaloop support'),
+    '#description' => t("Enables Froogallop Vimeo's library support"),
+    '#default_value' => $defaults['loop'],
+  );
+
+  $form['class'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Player CSS class'),
+    '#description' => t('CSS class to add to the player'),
+    '#default_value' => $defaults['class'],
+  );
+
+  return $form;
+}
+
+/**
+ * Validates the form elements for the Vimeo configuration form.
+ *
+ * @param array $element
+ *   The form element to validate.
+ * @param array $form_state
+ *   The form to validate state.
+ * @param array $form
+ *   The form to validate structure.
+ */
+function video_embed_field_handler_vimeo_form_validate($element, &$form_state, $form) {
+  video_embed_field_validate_dimensions($element);
+}
+
+/**
+ * Calculates the min index for use in finding the id of a youtube video.
+ *
+ * @param string $pos1
+ *   The first index.
+ * @param string $pos2
+ *   The second index.
+ *
+ * @return string
+ *   The min index.
+ */
+function _video_embed_get_min($pos1, $pos2) {
+  if (!$pos1) {
+    return $pos2;
+  }
+  elseif (!$pos2) {
+    return $pos1;
+  }
+  else {
+    return min($pos1, $pos2);
+  }
+}

+ 18 - 0
sites/all/modules/contrib/fields/video_embed_field/video_embed_field.info

@@ -0,0 +1,18 @@
+name = "Video Embed Field"
+description = "Expose a field type for embedding videos from youtube or vimeo."
+core = 7.x
+package = Media
+configure = admin/config/media/vef
+
+files[] = video_embed_field.migrate.inc
+files[] = views/handlers/views_embed_field_views_handler_field_thumbnail_path.inc
+
+dependencies[] = ctools
+dependencies[] = image
+
+; Information added by Drupal.org packaging script on 2015-09-07
+version = "7.x-2.0-beta11"
+core = "7.x"
+project = "video_embed_field"
+datestamp = "1441639440"
+

+ 391 - 0
sites/all/modules/contrib/fields/video_embed_field/video_embed_field.install

@@ -0,0 +1,391 @@
+<?php
+
+/**
+ * @file
+ * Install, update and uninstall functions for the video_embed_field module.
+ */
+
+/**
+ * Install file for video_embed_field module
+ * @author jcaldwell
+ */
+
+/**
+ * Implements hook_field_schema().
+ */
+function video_embed_field_field_schema($field) {
+  switch ($field['type']) {
+    case 'video_embed_field':
+      $columns = array(
+        'video_url' => array(
+          'type' => 'varchar',
+          'length' => 512,
+          'default' => '',
+        ),
+        'thumbnail_path' => array(
+          'type' => 'varchar',
+          'length' => 512,
+          'default' => '',
+        ),
+        'video_data' => array(
+          'type' => 'blob',
+          'not null' => FALSE,
+          'size' => 'big',
+          'serialize' => TRUE,
+        ),
+        'embed_code' => array(
+          'type' => 'varchar',
+          'length' => 1024,
+          'default' => '',
+        ),
+        'description' => array(
+          'type' => 'text',
+          'not null' => FALSE,
+        ),
+      );
+      $indexes = array();
+      break;
+  }
+
+  return array(
+    'columns' => $columns,
+    'indexes' => $indexes,
+  );
+}
+
+/**
+ * Implements hook_schema().
+ */
+function video_embed_field_schema() {
+  $schema['vef_video_styles'] = array(
+    'description' => 'Stores video embed styles.',
+    'export' => array(
+      'key' => 'name',
+      'identifier' => 'video_embed_style',
+      'default hook' => 'default_video_embed_styles',
+      'api' => array(
+        'owner' => 'video_embed_field',
+        'api' => 'default_video_embed_styles',
+        'minimum_version' => 1,
+        'current_version' => 1,
+      ),
+    ),
+    'fields' => array(
+      'name' => array(
+        'description' => 'The machine-readable option set name.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+      ),
+      'title' => array(
+        'description' => 'The human-readable title for this option set.',
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+      ),
+      'data' => array(
+        'description' => 'The configuration data for the style.',
+        'type' => 'blob',
+        'size' => 'big',
+        'not null' => TRUE,
+        'serialize' => TRUE,
+      ),
+    ),
+    'primary key' => array('name'),
+  );
+  return $schema;
+}
+
+/**
+ * Implements hook_uninstall().
+ */
+function video_embed_field_uninstall() {
+  variable_del('video_embed_field_youtube_api_key');
+}
+
+/**
+ * Adds an optional description form.
+ */
+function video_embed_field_update_7000() {
+  // Get the list of fields of type 'video_embed_field'.
+  $video_embed_fields = array();
+  foreach (field_info_fields() as $field_name => $field_info) {
+    if ($field_info['type'] == 'video_embed_field') {
+      $video_embed_fields[$field_name] = field_read_field($field_name);
+    }
+  }
+
+  foreach ($video_embed_fields as $field) {
+    if ($field['deleted']) {
+      $table = "field_deleted_data_{$field['id']}";
+      $revision_table = "field_deleted_revision_{$field['id']}";
+    }
+    else {
+      $table = "field_data_{$field['field_name']}";
+      $revision_table = "field_revision_{$field['field_name']}";
+    }
+    $column = $field['field_name'] . '_description';
+    db_add_field($table, $column, array('type' => 'text', 'not null' => FALSE));
+    db_add_field($revision_table, $column, array('type' => 'text', 'not null' => FALSE));
+  }
+
+  return t('Additional columns added.');
+}
+
+/**
+ * Adds video style storage table.
+ */
+function video_embed_field_update_7001() {
+  if (!db_table_exists('vef_video_styles')) {
+    $schema = video_embed_field_schema();
+    db_create_table('vef_video_styles', $schema['vef_video_styles']);
+  }
+
+  return t('Video styles storage table created.');
+}
+/**
+ * Adds field for storing the path to the video thumbnail.
+ */
+function video_embed_field_update_7002() {
+  // Get the list of fields of type 'video_embed_field'.
+  $video_embed_fields = array();
+  foreach (field_info_fields() as $field_name => $field_info) {
+    if ($field_info['type'] == 'video_embed_field') {
+      $video_embed_fields[$field_name] = field_read_field($field_name);
+    }
+  }
+
+  foreach ($video_embed_fields as $field) {
+    if ($field['deleted']) {
+      $table = "field_deleted_data_{$field['id']}";
+      $revision_table = "field_deleted_revision_{$field['id']}";
+    }
+    else {
+      $table = "field_data_{$field['field_name']}";
+      $revision_table = "field_revision_{$field['field_name']}";
+    }
+    $column = $field['field_name'] . '_thumbnail_path';
+    db_add_field($table, $column, array(
+      'type' => 'varchar',
+      'length' => 512,
+      'default' => '',
+    ));
+    db_add_field($revision_table, $column, array(
+      'type' => 'varchar',
+      'length' => 512,
+      'default' => '',
+    ));
+  }
+
+  return t('Thumbnail column added.');
+}
+
+/**
+ * Enables inline colorbox support if colorbox is installed.
+ *
+ * [NO LONGER NEEDED - This update hook does nothing]
+ */
+function video_embed_field_update_7003() {
+}
+
+/**
+ * Enables colorbox load support if colorbox is installed.
+ */
+function video_embed_field_update_7004() {
+  variable_set('colorbox_load', 1);
+}
+
+/**
+ * Adds data column to field database.
+ */
+function video_embed_field_update_7005() {
+  // Get the list of fields of type 'video_embed_field'.
+  $video_embed_fields = array();
+  foreach (field_info_fields() as $field_name => $field_info) {
+    if ($field_info['type'] == 'video_embed_field') {
+      $video_embed_fields[$field_name] = field_read_field($field_name);
+    }
+  }
+
+  foreach ($video_embed_fields as $field) {
+    if ($field['deleted']) {
+      $table = "field_deleted_data_{$field['id']}";
+      $revision_table = "field_deleted_revision_{$field['id']}";
+    }
+    else {
+      $table = "field_data_{$field['field_name']}";
+      $revision_table = "field_revision_{$field['field_name']}";
+    }
+    $column = $field['field_name'] . '_video_data';
+    db_add_field($table, $column, array(
+      'type' => 'blob',
+      'not null' => FALSE,
+      'size' => 'big',
+      'serialize' => TRUE,
+    ));
+    db_add_field($revision_table, $column, array(
+      'type' => 'blob',
+      'not null' => FALSE,
+      'size' => 'big',
+      'serialize' => TRUE,
+    ));
+  }
+
+  return t('Data column added. Please clear cache.');
+}
+
+/**
+ * Updates vef_video_styles table structure.
+ */
+function video_embed_field_update_7006() {
+  // Convert the table structure.
+  db_drop_field('vef_video_styles', 'vsid');
+  db_add_primary_key('vef_video_styles', array('name'));
+  db_drop_unique_key('vef_video_styles', 'name');
+
+  db_add_field('vef_video_styles', 'title', array(
+    'type' => 'varchar',
+    'length' => 255,
+    'not null' => TRUE,
+    'default' => '',
+  ));
+  // Update title and name values.
+  $result = db_select('vef_video_styles', 'vef')
+    ->fields('vef', array('name'))
+    ->execute();
+  foreach ($result as $record) {
+    // Set current name as title.
+    db_update('vef_video_styles')
+      ->fields(array(
+        'title' => $record->name,
+      ))
+      ->condition('name', $record->name)
+      ->execute();
+
+    // Update name to fit with machine_name constraints.
+    $new_name = preg_replace('/[^a-z0-9_]+/', '_', drupal_strtolower($record->name));
+    if ($new_name != $record->name) {
+      // Check if new name already exists in the database.
+      $counter = 1;
+      $base_name = $new_name;
+      while (TRUE) {
+        $result = db_select('vef_video_styles', 'vef')
+          ->fields('vef', array('name'))
+          ->condition('name', $new_name)
+          ->execute();
+        if ($result->rowCount()) {
+          $new_name = $base_name . '_' . $counter;
+        }
+        else {
+          db_update('vef_video_styles')
+            ->fields(array(
+              'name' => $new_name,
+            ))
+            ->condition('name', $record->name)
+            ->execute();
+          break;
+        }
+      }
+    }
+  }
+
+  return t('Database schema updated successfully');
+}
+
+/**
+ * Update youtube "hd" URL deprecated parameter.
+ */
+function video_embed_field_update_7007() {
+  drupal_get_schema('vef_video_styles', TRUE);
+  ctools_include('export');
+  $styles = ctools_export_load_object('vef_video_styles');
+  foreach ($styles as $style) {
+    if (isset($style->data['youtube']['hd'])) {
+      if ($style->data['youtube']['hd']) {
+        $style->data['youtube']['vq'] = 'hd720';
+      }
+      else {
+        $style->data['youtube']['vq'] = 'large';
+      }
+      unset($style->data['youtube']['hd']);
+      ctools_export_crud_save('vef_video_styles', $style);
+    }
+  }
+
+  return t('Parameter hd has been converted to vq.');
+}
+
+/**
+ * Updates naming of 'node' formatter setting to 'content'.
+ */
+function video_embed_field_update_7008() {
+  $instances = field_info_instances();
+  foreach ($instances as $entity_type) {
+    foreach ($entity_type as $bundle) {
+      foreach ($bundle as $instance) {
+        $field_info = field_info_field($instance['field_name']);
+        if ($field_info['type'] == 'video_embed_field') {
+          $update = FALSE;
+          foreach ($instance['display'] as &$display) {
+            if ($display['type'] == 'video_embed_field_thumbnail') {
+              if ($display['settings']['image_link'] == 'node') {
+                $display['settings']['image_link'] = 'content';
+                $update = TRUE;
+              }
+              if ($display['settings']['image_style'] == 'none') {
+                $display['settings']['image_style'] = '';
+                $update = TRUE;
+              }
+            }
+          }
+          if ($update) {
+            field_update_instance($instance);
+          }
+        }
+      }
+    }
+  }
+
+  return t("Updated 'node' setting to 'content'");
+}
+
+/**
+ * Adds new Allowed Providers setting to existing instances.
+ */
+function video_embed_field_update_7009() {
+  $allowed_providers = array_keys(video_embed_get_handlers());
+
+  $instances = field_info_instances();
+  foreach ($instances as $entity_type) {
+    foreach ($entity_type as $bundle) {
+      foreach ($bundle as $instance) {
+        $field_info = field_info_field($instance['field_name']);
+        if ($field_info['type'] == 'video_embed_field') {
+          $instance['settings']['allowed_providers'] = $allowed_providers;
+          field_update_instance($instance);
+        }
+      }
+    }
+  }
+
+  return t('Updated default instance settings');
+}
+
+/**
+ * Update styles with empty class parameter.
+ */
+function video_embed_field_update_7010() {
+  drupal_get_schema('vef_video_styles', TRUE);
+  ctools_include('export');
+  $styles = ctools_export_load_object('vef_video_styles');
+  foreach ($styles as $style) {
+    foreach ($style->data as &$provider) {
+      if (!isset($provider['class'])) {
+        $provider['class'] = '';
+      }
+    }
+    ctools_export_crud_save('vef_video_styles', $style);
+  }
+
+  return 'Parameter class added to existing styles';
+}

+ 57 - 0
sites/all/modules/contrib/fields/video_embed_field/video_embed_field.migrate.inc

@@ -0,0 +1,57 @@
+<?php
+/**
+ * @file
+ * Migrate support for Video Embed Field module.
+ */
+
+/**
+ * Implements hook_migrate_api().
+ */
+function video_embed_field_migrate_api() {
+  $api = array(
+    'api' => 2,
+    'field handlers' => array('MigrateVideoEmbedFieldFieldHandler'),
+  );
+  return $api;
+}
+
+/**
+ * Custom extended MigrateFieldHandler class for Video Embed Field module.
+ */
+class MigrateVideoEmbedFieldFieldHandler extends MigrateFieldHandler {
+
+  public function __construct() {
+    $this->registerTypes(array('video_embed_field'));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function fields($type, $parent_field, $migration = NULL) {
+    $fields = array(
+      'video_url' => t('Video: The video URL.'),
+    );
+    return $fields;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function prepare($entity, array $field_info, array $instance, array $values) {
+    $arguments = array();
+    if (isset($values['arguments'])) {
+      $arguments = array_filter($values['arguments']);
+      unset($values['arguments']);
+    }
+    $language = $this->getFieldLanguage($entity, $field_info, $arguments);
+
+    // Setup the standard Field API array for saving.
+    $delta = 0;
+    foreach ($values as $value) {
+      $return[$language][$delta] = array('video_url' => $value);
+      $delta++;
+    }
+
+    return isset($return) ? $return : NULL;
+  }
+}

+ 722 - 0
sites/all/modules/contrib/fields/video_embed_field/video_embed_field.module

@@ -0,0 +1,722 @@
+<?php
+
+/**
+ * @file
+ * Provides a simple field for easily embedding videos from youtube or vimeo
+ *
+ * This module is not intended to replace media or video - it does not allow for
+ * any local storage of videos, custom players or anything else.
+ * It simply allows users to embed videos from youtube and vimeo - and provides
+ * hooks to allow other modules to provide more providers.
+ *
+ * Uses CTools Export UI to manage settings.
+ *
+ * @see ./plugins/export_ui/video_embed_field_export_ui.inc
+ *
+ * @author jec006, jdelaune
+ */
+
+// Load all Field module hooks.
+module_load_include('inc', 'video_embed_field', 'video_embed_field.field');
+// Load the admin forms.
+module_load_include('inc', 'video_embed_field', 'video_embed_field.admin');
+// Load our default handlers.
+module_load_include('inc', 'video_embed_field', 'video_embed_field.handlers');
+// Load feeds mapping hooks.
+module_load_include('inc', 'video_embed_field', 'video_embed_field.feeds');
+
+/**
+ * Implements hook_ctools_plugin_directory().
+ */
+function video_embed_field_ctools_plugin_directory($module, $type) {
+  // Load the export_ui plugin.
+  if ($type == 'export_ui') {
+    return 'plugins/export_ui';
+  }
+}
+
+/**
+ * Implements hook_ctools_plugin_api().
+ *
+ * Tell CTools that we support the default_mymodule_presets API.
+ */
+function video_embed_field_ctools_plugin_api($owner, $api) {
+  if ($owner == 'video_embed_field' && $api == 'default_video_embed_styles') {
+    return array('version' => 1);
+  }
+}
+
+/**
+ * Implements hook_default_video_styles().
+ */
+function video_embed_field_default_video_embed_styles() {
+  $styles = array();
+
+  $handlers = video_embed_get_handlers();
+  // Create the normal handler.
+  $normal = new stdClass();
+  $normal->disabled = FALSE; /* Edit this to true to make a default video_embed_style disabled initially */
+  $normal->api_version = 1;
+  $normal->name = 'normal';
+  $normal->title = 'Normal';
+  $normal->data = array();
+
+  $teaser = new stdClass();
+  $teaser->disabled = FALSE; /* Edit this to true to make a default video_embed_style disabled initially */
+  $teaser->api_version = 1;
+  $teaser->name = 'teaser';
+  $teaser->title = 'Teaser';
+  $teaser->data = array();
+
+  // Add in our settings for each of the handlers.
+  foreach ($handlers as $name => $handler) {
+    $normal->data[$name] = $handler['defaults'];
+    $teaser->data[$name] = $handler['defaults'];
+    $teaser->data[$name]['width'] = 480;
+    $teaser->data[$name]['height'] = 270;
+  }
+
+  return array($normal, $teaser);
+}
+
+/**
+ * Implements hook_menu().
+ */
+function video_embed_field_menu() {
+  $items = array();
+
+  $items['vef/load/%'] = array(
+    'title' => 'Video Embed Field - Load Video',
+    'page callback' => '_video_embed_field_show_video',
+    'page arguments' => array(2),
+    'access callback' => TRUE,
+    'type' => MENU_CALLBACK,
+  );
+
+  $items['admin/config/media/vef'] = array(
+    'title' => 'Video Embed Field',
+    'description' => 'Video Embed Field configuration',
+    'page callback' => 'system_admin_menu_block_page',
+    'access arguments' => array('administer video styles'),
+    'file' => 'system.admin.inc',
+    'file path' => drupal_get_path('module', 'system'),
+    'type' => MENU_NORMAL_ITEM,
+  );
+
+  $items['admin/config/media/vef/settings'] = array(
+    'title' => 'Settings',
+    'description' => 'Video Embed Field module settings',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('video_embed_field_settings_form'),
+    'file' => 'video_embed_field.admin.inc',
+    'access arguments' => array('administer video styles'),
+    'type' => MENU_NORMAL_ITEM,
+  );
+
+  return $items;
+}
+
+/**
+ * Implements hook_permission().
+ */
+function video_embed_field_permission() {
+  return array(
+    'administer video styles' => array(
+      'title' => t('Administer video styles'),
+      'description' => t('Create and modify styles for embedded videos.'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_theme().
+ */
+function video_embed_field_theme() {
+  return array(
+    // Theme functions in video_embed_field.admin.inc.
+    'video_embed_field_video_style_list' => array(
+      'variables' => array('styles' => NULL),
+    ),
+    'video_embed_field_embed_code' => array(
+      'template' => 'video-embed-field-embed-code',
+      'variables' => array(
+        'url' => NULL,
+        'style' => 'normal',
+        'video_data' => array(),
+      ),
+    ),
+    'video_embed_field_colorbox_code' => array(
+      'variables' => array(
+        'image_url' => NULL,
+        'image_style' => 'normal',
+        'image_alt' => NULL,
+        'video_url' => NULL,
+        'video_style' => NULL,
+        'video_data' => array(),
+      ),
+    ),
+  );
+}
+
+/**
+ * Implements hook_views_api().
+ */
+function video_embed_field_views_api() {
+  return array(
+    'api' => 3,
+    'path' => drupal_get_path('module', 'video_embed_field') . '/views',
+  );
+}
+
+/**
+ * Get an array of all styles and their settings.
+ *
+ * @return array
+ *   An array of styles keyed by the video style name (name).
+ *
+ * @see video_embed_field_video_style_load()
+ */
+function video_embed_field_video_styles() {
+  $styles = &drupal_static(__FUNCTION__);
+
+  // Grab from cache or build the array.
+  if (!isset($styles)) {
+    // Load the style via ctools - which will handle all the caching for us -
+    // Because it does a bit more logic, lets still statically cache this.
+    ctools_include('export');
+    $styles = ctools_export_load_object('vef_video_styles');
+  }
+
+  return $styles;
+}
+
+/**
+ * Load a style by style name. May be used as a loader for menu items.
+ *
+ * Note that you may also use ctools_export_load_object with the key being
+ * vef_video_styles
+ *
+ * @param string $name
+ *   The name of the style.
+ *
+ * @return array
+ *   An video style array containing the following keys:
+ *   - "name": The unique video style ID.
+ *   - "title": The human readable video style name.
+ *   - "data": An array of video settings within this video style.
+ *   If the video style name or ID is not valid, an empty array is returned.
+ */
+function video_embed_field_video_style_load($name) {
+  $styles = video_embed_field_video_styles();
+
+  return isset($styles[$name]) ? $styles[$name] : FALSE;
+}
+
+/**
+ * Creates a hook that other modules can implement to get handlers.
+ *
+ * Can be used to add more handlers if needed - from other modules and such.
+ *
+ * @see hook_video_embed_handler_info
+ * @see video_embed_field.api.php
+ */
+function video_embed_get_handlers() {
+  $handlers = &drupal_static(__FUNCTION__);
+
+  if (!isset($handlers)) {
+    if ($handlers = cache_get('video_embed_field_handlers')) {
+      $handlers = $handlers->data;
+    }
+    else {
+      $handlers = module_invoke_all('video_embed_handler_info');
+      drupal_alter('video_embed_handler_info', $handlers);
+      cache_set('video_embed_field_handlers', $handlers);
+    }
+  }
+
+  return $handlers;
+}
+
+/**
+ * Retrieves the video handler for a video URL.
+ *
+ * @param string $url
+ *   The video URL.
+ *
+ * @return string|bool
+ *   The handler name for the URL, FALSE in case there is no handler.
+ */
+function video_embed_get_handler($url) {
+  // Process video URL.
+  if (!stristr($url, 'http://') && !stristr($url, 'https://')) {
+    $url = 'http://' . $url;
+  }
+  $parts = parse_url($url);
+  if (!isset($parts['host'])) {
+    return FALSE;
+  }
+
+  $host = $parts['host'];
+  if (stripos($host, 'www.') > -1) {
+    $host = substr($host, 4);
+  }
+
+  $domains = _video_embed_field_get_provider_domains();
+  $handlers = video_embed_get_handlers();
+  if (isset($domains[$host])) {
+    $handler_name = $domains[$host];
+    $handler = $handlers[$handler_name];
+    $handler['name'] = $handler_name;
+    return $handler;
+  }
+  else {
+    return FALSE;
+  }
+}
+
+/**
+ * Creates a form from the player configuration options.
+ *
+ * @param array $defaults
+ *   The default settings for the various fields.
+ *
+ * @return array
+ *   The configuration form array.
+ */
+function video_embed_field_get_form($defaults) {
+  $form = array();
+
+  $handlers = video_embed_get_handlers();
+
+  foreach ($handlers as $name => $handler) {
+    if (isset($handler['form']) && function_exists($handler['form'])) {
+      $handler_defaults = isset($defaults[$name]) ? $defaults[$name] : array();
+      $handler_defaults = array_merge($handler['defaults'], $handler_defaults);
+
+      $form[$name] = call_user_func($handler['form'], $handler_defaults);
+
+      $form[$name] += array(
+        '#type' => 'fieldset',
+        '#title' => t('@provider settings', array('@provider' => $handler['title'])),
+        '#tree' => TRUE,
+        '#element_validate' => isset($handler['form_validate']) ? array($handler['form_validate']) : array(),
+      );
+    }
+  }
+
+  return $form;
+}
+
+/**
+ * Validates the iframe CSS dimensions.
+ *
+ * @param array $element
+ *   The element to validate.
+ */
+function video_embed_field_validate_dimensions($element) {
+  if (!preg_match('/^(\d*)(px|%)?$/', $element['width']['#value'], $results)) {
+    form_error($element['width'], t('You should use a valid CSS value for width in @plugin plugin', array('@plugin' => $element['#title'])));
+  }
+  if (!preg_match('/^(\d*)(px|%)?$/', $element['height']['#value'], $results)) {
+    form_error($element['height'], t('You should use a valid CSS value for height in @plugin plugin', array('@plugin' => $element['#title'])));
+  }
+}
+
+/**
+ * Get an array of image styles suitable for using as select list options.
+ *
+ * @param bool $include_empty
+ *   If TRUE a <none> option will be inserted in the options array.
+ *
+ * @return array
+ *   Array of image styles both key and value are set to style name.
+ */
+function video_embed_field_video_style_options($include_empty = TRUE) {
+  $styles = video_embed_field_video_styles();
+  $options = array();
+  if ($include_empty && !empty($styles)) {
+    $options[''] = t('<none>');
+  }
+  foreach ($styles as $style) {
+    $options[$style->name] = $style->title;
+  }
+  if (empty($options)) {
+    $options[''] = t('No defined styles');
+  }
+  return $options;
+}
+
+/**
+ * Implements hook_filter_info().
+ */
+function video_embed_field_filter_info() {
+  $filters['video_embed_field'] = array(
+    'title' => t('Video Embedding'),
+    'description' => t('Replaces [VIDEO::http://www.youtube.com/watch?v=someVideoID::aVideoStyle] tags with embedded videos.'),
+    'process callback' => 'video_embed_field_filter_process',
+    'tips callback' => '_filter_video_embed_tips',
+  );
+
+  return $filters;
+}
+
+/**
+ * Implements callback_filter_tips().
+ *
+ * Provides help for the URL filter.
+ *
+ * @see filter_filter_info()
+ */
+function _filter_video_embed_tips($filter, $format, $long = FALSE) {
+  return t('Replaces [VIDEO::http://www.youtube.com/watch?v=someVideoID::aVideoStyle] tags with embedded videos.');
+}
+
+/**
+ * Video Embed Field filter process callback.
+ */
+function video_embed_field_filter_process($text, $filter, $format) {
+  preg_match_all('/ \[VIDEO:: ( [^\[\]]+ )* \] /x', $text, $matches);
+
+  $tag_match = (array) array_unique($matches[1]);
+
+  foreach ($tag_match as $tag) {
+    $parts = explode('::', $tag);
+
+    // Get video style.
+    if (isset($parts[1])) {
+      $style = $parts[1];
+    }
+    else {
+      $style = 'normal';
+    }
+
+    $embed_code = theme('video_embed_field_embed_code', array('url' => $parts[0], 'style' => $style));
+
+    $text = str_replace('[VIDEO::' . $tag . ']', $embed_code, $text);
+  }
+
+  return $text;
+}
+
+/**
+ * Processes variables to format a video player.
+ *
+ * @param array $variables
+ *   Contains the following information:
+ *    - $url
+ *    - $style
+ *    - $video_data
+ *
+ * @see video-embed.tpl.php
+ */
+function template_preprocess_video_embed_field_embed_code(&$variables) {
+  // Get the handler.
+  $handler = video_embed_get_handler($variables['url']);
+  $variables['handler'] = $handler['name'];
+
+  // Load the style.
+  $style = video_embed_field_video_style_load($variables['style']);
+  // If there was an issue load in the default style.
+  if ($style == FALSE) {
+    $style = video_embed_field_video_style_load('normal');
+  }
+  if (isset($style->data[$variables['handler']])) {
+    $variables['style_settings'] = $style->data[$variables['handler']];
+  }
+  // Safety value for when we add new handlers and there are styles stored.
+  else {
+    $variables['style_settings'] = $handler['defaults'];
+  }
+
+  // Prepare the URL.
+  if (!stristr($variables['url'], 'http://') && !stristr($variables['url'], 'https://')) {
+    $variables['url'] = 'http://' . $variables['url'];
+  }
+
+  // Prepare embed code.
+  if ($handler && isset($handler['function']) && function_exists($handler['function'])) {
+    $embed_code = call_user_func($handler['function'], $variables['url'], $variables['style_settings']);
+    $variables['embed_code'] = drupal_render($embed_code);
+  }
+  else {
+    $variables['embed_code'] = l($variables['url'], $variables['url']);
+  }
+
+  // Prepare video data.
+  $variables['data'] = $variables['video_data'];
+  unset($variables['video_data']);
+}
+
+/**
+ * Returns image style image with a link to an embedded video in colorbox.
+ *
+ * @param array $variables
+ *   An associative array containing:
+ *   - image_url: The image URL.
+ *   - image_style: The image style to use.
+ *   - image_alt: The image ALT attribute.
+ *   - video_url: The video URL.
+ *   - video_style: The video style to use.
+ *   - video_data: An array of data about the video.
+ *
+ * @return string
+ *   The themed output.
+ *
+ * @ingroup themeable
+ */
+function theme_video_embed_field_colorbox_code($variables) {
+  $path = video_embed_field_get_ajax_url($variables['video_url'], $variables['video_style']);
+
+  $image = array(
+    '#theme' => 'image_formatter',
+    '#item' => array('uri' => $variables['image_url'], 'alt' => $variables['image_alt']),
+    '#image_style' => $variables['image_style'],
+    '#path' => $path,
+  );
+
+  return drupal_render($image);
+}
+
+/**
+ * Gets the thumbnail url for a given video url.
+ *
+ * @param string $url
+ *   The url of the video.
+ *
+ * @return string
+ *   String representing the url of the thumbnail, or FALSE on error.
+ */
+function video_embed_field_thumbnail_url($url) {
+  $info = FALSE;
+  if ($handler = video_embed_get_handler($url)) {
+    if (isset($handler['thumbnail_function']) && function_exists($handler['thumbnail_function'])) {
+      $info = call_user_func($handler['thumbnail_function'], $url);
+      $info['handler'] = $handler['name'];
+    }
+    if (empty($info['url']) && isset($handler['thumbnail_default']) && file_exists($handler['thumbnail_default'])) {
+      $info = array(
+        'handler' => $handler['name'],
+        'id' => 'default_thumbnail',
+        'url' => $handler['thumbnail_default'],
+      );
+    }
+  }
+  return $info;
+}
+
+/**
+ * Gets a video data array for a given video url.
+ *
+ * @param string $url
+ *   A video URL of the data array you want returned.
+ *
+ * @return array|false
+ *   An array of video data, or FALSE on error.
+ */
+function video_embed_field_get_video_data($url) {
+  $handler = video_embed_get_handler($url);
+  if ($handler && isset($handler['data_function']) && function_exists($handler['data_function'])) {
+    $data = call_user_func($handler['data_function'], $url);
+    $data['handler'] = $handler['name'];
+    return $data;
+  }
+  return FALSE;
+}
+
+/**
+ * Generates the AJAX path array from the video URL and the video_style.
+ *
+ * @param string $video_url
+ *   The URL to the video.
+ * @param string $video_style
+ *   The video style to render the video.
+ *
+ * @return array
+ *   The AJAX path array.
+ */
+function video_embed_field_get_ajax_url($video_url, $video_style) {
+  $style = video_embed_field_video_style_load($video_style);
+
+  // If there was an issue load in the default style.
+  if ($style == FALSE) {
+    $style = video_embed_field_video_style_load('normal');
+  }
+
+  $handler = video_embed_get_handler($video_url);
+
+  $data = $style->data[$handler['name']];
+
+  // Write values for later AJAX load.
+  $hash = _video_embed_field_store_video($video_url, $video_style);
+
+  return array(
+    'path' => 'vef/load/' . $hash,
+    'options' => array(
+      'attributes' => array(
+        'class' => array(
+          'colorbox-load',
+          'colorbox'
+        ),
+      ),
+      'query' => array(
+        'width' => $data['width'],
+        'height' => $data['height'] + 5,
+      ),
+    ),
+  );
+}
+
+/**
+ * Fetches all available provider domains.
+ *
+ * @return array
+ *   An array containing the allowed video domains.
+ */
+function _video_embed_field_get_provider_domains() {
+  $domains = array();
+
+  $handlers = video_embed_get_handlers();
+  foreach ($handlers as $name => $handler) {
+    if (isset($handler['function']) && function_exists($handler['function'])) {
+      foreach ($handler['domains'] as $domain) {
+        $domains[$domain] = $name;
+      }
+    }
+  }
+
+  return $domains;
+}
+
+/**
+ * Fetches all available provider domains for certain field instance.
+ *
+ * @param array $instance
+ *   The instance definition.
+ *
+ * @return array
+ *   An array containing the allowed video domains.
+ */
+function _video_embed_field_get_instance_provider_domains($instance) {
+  return array_intersect(_video_embed_field_get_provider_domains(), $instance['settings']['allowed_providers']);
+}
+
+/**
+ * Fetches settings string.
+ *
+ * @param array $settings
+ *   The settings array.
+ *
+ * @return string
+ *   The settings string generated from the settings array.
+ */
+function _video_embed_code_get_settings_str($settings = array()) {
+  $values = array();
+
+  foreach ($settings as $name => $value) {
+    if (!isset($value)) {
+      $values[] = $name;
+    }
+    else {
+      $values[] = $name . '=' . $value;
+    }
+  }
+
+  return implode('&amp;', $values);
+}
+
+/**
+ * Stores a video to be loaded later from an _video_embed_field_load_video.
+ *
+ * @param string $video_url
+ *   The video URL.
+ * @param string $video_style
+ *   The video style.
+ *
+ * @return string
+ *   The hash generated for the video URL and the given style.
+ */
+function _video_embed_field_store_video($video_url, $video_style) {
+  // Create a hash key.
+  $hash = _video_embed_field_hash($video_url, $video_style);
+
+  // Check that this record doesn't already exist before saving it.
+  if (!_video_embed_field_load_video($hash)) {
+    $record = array(
+      'vhash' => $hash,
+      'video_url' => $video_url,
+      'video_style' => $video_style,
+    );
+
+    cache_set('vef-store-' . $hash, $record);
+
+    // Add it to our static cache so we won't have to go to the database.
+    $static_cache = &drupal_static('vef_video_store', array());
+    $static_cache[$hash] = $record;
+  }
+  return $hash;
+}
+
+/**
+ * Renders a video for an AJAX call.
+ *
+ * @param string $hash
+ *   The video hash.
+ *
+ * @return Null
+ *   Null because prints an AJAX output.
+ */
+function _video_embed_field_show_video($hash) {
+  $data = _video_embed_field_load_video($hash);
+  $video = array(
+    '#theme' => 'video_embed_field_embed_code',
+    '#style' => $data['video_style'],
+    '#url' => $data['video_url'],
+  );
+
+  print drupal_render($video);
+  return NULL;
+}
+
+/**
+ * Loads a video from the video store given its hash.
+ *
+ * @param string $hash
+ *   The video hash.
+ *
+ * @return array|bool
+ *   An array with video definition, FALSE if the hash does not exist.
+ */
+function _video_embed_field_load_video($hash) {
+  $static_cache = &drupal_static('vef_video_store', array());
+  // Check if we've already loaded it.
+  if (isset($static_cache[$hash])) {
+    return $static_cache[$hash];
+  }
+  else {
+    $result = cache_get('vef-store-' . $hash);
+    if ($result) {
+      // Cache it before returning.
+      $data = $result->data;
+      $static_cache[$hash] = $data;
+      return $data;
+    }
+    else {
+      return FALSE;
+    }
+  }
+}
+
+/**
+ * Creates a hash for storing or looking up a video in the store table.
+ *
+ * @param string $video_url
+ *   The video URL.
+ * @param string $video_style
+ *   The video style.
+ *
+ * @return string
+ *   The hash generated for the video URL and the given style.
+ */
+function _video_embed_field_hash($video_url, $video_style) {
+  return md5('vef' . $video_url . $video_style);
+}

+ 22 - 0
sites/all/modules/contrib/fields/video_embed_field/views/handlers/views_embed_field_views_handler_field_thumbnail_path.inc

@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @file
+ * Video embed field thumbnail_path column implementation.
+ */
+
+/**
+ * Defines a field handler that can display the thumbnail_path url instead of
+ * the drupal internal uri.
+ */
+class views_embed_field_views_handler_field_thumbnail_path extends views_handler_field {
+
+  /**
+   * {@inheritdoc}
+   */
+  function get_value($values, $field = NULL) {
+    $value = parent::get_value($values, $field);
+
+    return file_create_url($value);
+  }
+}

+ 72 - 0
sites/all/modules/contrib/fields/video_embed_field/views/video_embed_field.views.inc

@@ -0,0 +1,72 @@
+<?php
+
+/**
+ * @file
+ * Hooks for Views integration.
+ */
+
+/**
+ * Implements hook_field_views_data().
+ */
+function video_embed_field_field_views_data($field) {
+  $data = field_views_field_default_views_data($field);
+
+  // Only expose these components as Views field handlers.
+  $implemented = array(
+    'video_url' => 'views_handler_field',
+    'thumbnail_path' => 'views_embed_field_views_handler_field_thumbnail_path',
+    'description' => 'views_handler_field',
+  );
+
+  // Get the translated field information.
+  $properties = video_embed_field_data_property_info();
+
+  // Iterate over video_embed_field defined tables.
+  foreach ($data as &$table) {
+    // Make sure the parent Views field (video_embed_field) is defined.
+    if (isset($table[$field['field_name']]['field'])) {
+      // Use the parent field definition as a template for component columns.
+      $field_def = $table[$field['field_name']]['field'];
+
+      // Remove 'additional fields' from the field definition. We don't
+      // necessarily want all our sibling columns.
+      unset($field_def['additional fields']);
+
+      // Define the valid columns.
+      $valid_columns = array();
+      foreach ($implemented as $implement => $handler) {
+        $column_name = $field['field_name'] . '_' . $implement;
+        $valid_columns[$column_name] = $handler;
+      }
+
+      // Iterate over the video_embed_field components.
+      foreach ($table as $column_name => &$column) {
+        if (empty($column['field']) && isset($valid_columns[$column_name])) {
+          // Assign the default component definition.
+          $column['field'] = $field_def;
+          $column['field']['real field'] = $column_name;
+          $column['field']['handler'] = $valid_columns[$column_name];
+
+          // Assign human-friendly labels for video_embed_field components.
+          $field_labels = field_views_field_label($field['field_name']);
+          $field_label = array_shift($field_labels);
+          $property = str_replace($field_def['field_name'] . '_', '', $column_name);
+
+          if (!empty($properties[$property])) {
+            $property_label = $properties[$property]['label'];
+
+            $title = t('@field-label - @property-label', array(
+              '@field-label' => $field_label,
+              '@property-label' => $property_label,
+            ));
+
+            $column['title'] = $title;
+            $column['title short'] = $title;
+          }
+        }
+      }
+    }
+  }
+
+  return $data;
+}

+ 0 - 0
sites/all/modules/contrib/fields/video_filter_field/LICENSE.txt


+ 0 - 0
sites/all/modules/contrib/fields/video_filter_field/README.txt


+ 0 - 0
sites/all/modules/contrib/fields/video_filter_field/video_filter_field.info


+ 3 - 0
sites/all/modules/contrib/fields/video_filter_field/video_filter_field.module

@@ -266,6 +266,9 @@ function video_filter_field_process($text, $video) {
     'video_filter_related' => 1,
   );
 
+    # this added to avoid php 5.4 notice : array to string conversion 
+    if(is_array($text)) $text = "";
+  
     $text = (string)$text; // Make sure $text is a string. 
     if (preg_match_all('/\[video(\:(.+))?( .+)?\]/isU', $text, $matches_code)) {
     foreach ($matches_code[0] as $ci => $code) {

+ 299 - 0
sites/all/modules/features/clameurs/clameurs.features.field_base.inc

@@ -0,0 +1,299 @@
+<?php
+/**
+ * @file
+ * clameurs.features.field_base.inc
+ */
+
+/**
+ * Implements hook_field_default_field_bases().
+ */
+function clameurs_field_default_field_bases() {
+  $field_bases = array();
+
+  // Exported field_base: 'field_description'
+  $field_bases['field_description'] = array(
+    'active' => 1,
+    'cardinality' => 1,
+    'deleted' => 0,
+    'entity_types' => array(),
+    'field_name' => 'field_description',
+    'field_permissions' => array(
+      'type' => 0,
+    ),
+    'foreign keys' => array(
+      'format' => array(
+        'columns' => array(
+          'format' => 'format',
+        ),
+        'table' => 'filter_format',
+      ),
+    ),
+    'indexes' => array(
+      'format' => array(
+        0 => 'format',
+      ),
+    ),
+    'locked' => 0,
+    'module' => 'text',
+    'settings' => array(
+      'entity_translation_sync' => FALSE,
+    ),
+    'translatable' => 0,
+    'type' => 'text_long',
+  );
+
+  // Exported field_base: 'field_doc'
+  $field_bases['field_doc'] = array(
+    'active' => 1,
+    'cardinality' => 1,
+    'deleted' => 0,
+    'entity_types' => array(),
+    'field_name' => 'field_doc',
+    'field_permissions' => array(
+      'type' => 0,
+    ),
+    'foreign keys' => array(
+      'taxonomy_term_data' => array(
+        'columns' => array(
+          'target_id' => 'tid',
+        ),
+        'table' => 'taxonomy_term_data',
+      ),
+    ),
+    'indexes' => array(
+      'target_id' => array(
+        0 => 'target_id',
+      ),
+    ),
+    'locked' => 0,
+    'module' => 'entityreference',
+    'settings' => array(
+      'entity_translation_sync' => FALSE,
+      'handler' => 'views',
+      'handler_settings' => array(
+        'behaviors' => array(
+          'views-select-list' => array(
+            'status' => 0,
+          ),
+        ),
+        'view' => array(
+          'args' => array(),
+          'display_name' => 'entityreference_1',
+          'view_name' => 'actions_filter',
+        ),
+      ),
+      'target_type' => 'taxonomy_term',
+    ),
+    'translatable' => 0,
+    'type' => 'entityreference',
+  );
+
+  // Exported field_base: 'field_ecouter'
+  $field_bases['field_ecouter'] = array(
+    'active' => 1,
+    'cardinality' => 1,
+    'deleted' => 0,
+    'entity_types' => array(),
+    'field_name' => 'field_ecouter',
+    'field_permissions' => array(
+      'type' => 0,
+    ),
+    'foreign keys' => array(
+      'tid' => array(
+        'columns' => array(
+          'tid' => 'tid',
+        ),
+        'table' => 'taxonomy_term_data',
+      ),
+    ),
+    'indexes' => array(
+      'tid' => array(
+        0 => 'tid',
+      ),
+    ),
+    'locked' => 0,
+    'module' => 'taxonomy',
+    'settings' => array(
+      'allowed_values' => array(
+        0 => array(
+          'vocabulary' => 'actions',
+          'parent' => 0,
+        ),
+      ),
+      'entity_translation_sync' => FALSE,
+    ),
+    'translatable' => 0,
+    'type' => 'taxonomy_term_reference',
+  );
+
+  // Exported field_base: 'field_episodes'
+  $field_bases['field_episodes'] = array(
+    'active' => 1,
+    'cardinality' => -1,
+    'deleted' => 0,
+    'entity_types' => array(),
+    'field_name' => 'field_episodes',
+    'field_permissions' => array(
+      'type' => 0,
+    ),
+    'foreign keys' => array(
+      'node' => array(
+        'columns' => array(
+          'target_id' => 'nid',
+        ),
+        'table' => 'node',
+      ),
+    ),
+    'indexes' => array(
+      'target_id' => array(
+        0 => 'target_id',
+      ),
+    ),
+    'locked' => 0,
+    'module' => 'entityreference',
+    'settings' => array(
+      'entity_translation_sync' => FALSE,
+      'handler' => 'base',
+      'handler_settings' => array(
+        'behaviors' => array(
+          'views-select-list' => array(
+            'status' => 0,
+          ),
+        ),
+        'sort' => array(
+          'type' => 'none',
+        ),
+        'target_bundles' => array(
+          'episode' => 'episode',
+        ),
+      ),
+      'target_type' => 'node',
+    ),
+    'translatable' => 0,
+    'type' => 'entityreference',
+  );
+
+  // Exported field_base: 'field_habiter'
+  $field_bases['field_habiter'] = array(
+    'active' => 1,
+    'cardinality' => 1,
+    'deleted' => 0,
+    'entity_types' => array(),
+    'field_name' => 'field_habiter',
+    'field_permissions' => array(
+      'type' => 0,
+    ),
+    'foreign keys' => array(
+      'taxonomy_term_data' => array(
+        'columns' => array(
+          'target_id' => 'tid',
+        ),
+        'table' => 'taxonomy_term_data',
+      ),
+    ),
+    'indexes' => array(
+      'target_id' => array(
+        0 => 'target_id',
+      ),
+    ),
+    'locked' => 0,
+    'module' => 'entityreference',
+    'settings' => array(
+      'entity_translation_sync' => FALSE,
+      'handler' => 'base',
+      'handler_settings' => array(
+        'behaviors' => array(
+          'views-select-list' => array(
+            'status' => 0,
+          ),
+        ),
+        'sort' => array(
+          'type' => 'none',
+        ),
+        'target_bundles' => array(
+          'actions' => 'actions',
+        ),
+      ),
+      'target_type' => 'taxonomy_term',
+    ),
+    'translatable' => 0,
+    'type' => 'entityreference',
+  );
+
+  // Exported field_base: 'field_thematique'
+  $field_bases['field_thematique'] = array(
+    'active' => 1,
+    'cardinality' => 1,
+    'deleted' => 0,
+    'entity_types' => array(),
+    'field_name' => 'field_thematique',
+    'field_permissions' => array(
+      'type' => 0,
+    ),
+    'foreign keys' => array(
+      'node' => array(
+        'columns' => array(
+          'target_id' => 'nid',
+        ),
+        'table' => 'node',
+      ),
+    ),
+    'indexes' => array(
+      'target_id' => array(
+        0 => 'target_id',
+      ),
+    ),
+    'locked' => 0,
+    'module' => 'entityreference',
+    'settings' => array(
+      'entity_translation_sync' => FALSE,
+      'handler' => 'base',
+      'handler_settings' => array(
+        'behaviors' => array(
+          'views-select-list' => array(
+            'status' => 0,
+          ),
+        ),
+        'sort' => array(
+          'type' => 'none',
+        ),
+        'target_bundles' => array(
+          'thematique' => 'thematique',
+        ),
+      ),
+      'target_type' => 'node',
+    ),
+    'translatable' => 0,
+    'type' => 'entityreference',
+  );
+
+  // Exported field_base: 'field_video'
+  $field_bases['field_video'] = array(
+    'active' => 1,
+    'cardinality' => 1,
+    'deleted' => 0,
+    'entity_types' => array(),
+    'field_name' => 'field_video',
+    'field_permissions' => array(
+      'type' => 0,
+    ),
+    'foreign keys' => array(),
+    'indexes' => array(
+      'height' => array(
+        0 => 'height',
+      ),
+      'width' => array(
+        0 => 'width',
+      ),
+    ),
+    'locked' => 0,
+    'module' => 'video_filter_field',
+    'settings' => array(
+      'entity_translation_sync' => FALSE,
+    ),
+    'translatable' => 0,
+    'type' => 'video_filter',
+  );
+
+  return $field_bases;
+}

+ 691 - 0
sites/all/modules/features/clameurs/clameurs.features.field_instance.inc

@@ -0,0 +1,691 @@
+<?php
+/**
+ * @file
+ * clameurs.features.field_instance.inc
+ */
+
+/**
+ * Implements hook_field_default_field_instances().
+ */
+function clameurs_field_default_field_instances() {
+  $field_instances = array();
+
+  // Exported field_instance: 'node-documentair-body'
+  $field_instances['node-documentair-body'] = array(
+    'bundle' => 'documentair',
+    'default_value' => NULL,
+    'deleted' => 0,
+    'description' => '',
+    'display' => array(
+      'default' => array(
+        'label' => 'hidden',
+        'module' => 'text',
+        'settings' => array(),
+        'type' => 'text_default',
+        'weight' => 0,
+      ),
+      'teaser' => array(
+        'label' => 'hidden',
+        'module' => 'text',
+        'settings' => array(
+          'trim_length' => 600,
+        ),
+        'type' => 'text_summary_or_trimmed',
+        'weight' => 0,
+      ),
+    ),
+    'entity_type' => 'node',
+    'field_name' => 'body',
+    'label' => 'Body',
+    'required' => FALSE,
+    'settings' => array(
+      'display_summary' => TRUE,
+      'entity_translation_sync' => FALSE,
+      'text_processing' => 1,
+      'user_register_form' => FALSE,
+    ),
+    'widget' => array(
+      'module' => 'text',
+      'settings' => array(
+        'rows' => 20,
+        'summary_rows' => 5,
+      ),
+      'type' => 'text_textarea_with_summary',
+      'weight' => 5,
+    ),
+  );
+
+  // Exported field_instance: 'node-documentair-field_description'
+  $field_instances['node-documentair-field_description'] = array(
+    'bundle' => 'documentair',
+    'default_value' => NULL,
+    'deleted' => 0,
+    'description' => '',
+    'display' => array(
+      'default' => array(
+        'label' => 'above',
+        'module' => 'text',
+        'settings' => array(),
+        'type' => 'text_default',
+        'weight' => 4,
+      ),
+      'teaser' => array(
+        'label' => 'above',
+        'settings' => array(),
+        'type' => 'hidden',
+        'weight' => 0,
+      ),
+    ),
+    'entity_type' => 'node',
+    'field_name' => 'field_description',
+    'label' => 'Description',
+    'required' => 0,
+    'settings' => array(
+      'entity_translation_sync' => FALSE,
+      'linkit' => array(
+        'button_text' => 'Recherche',
+        'enable' => 0,
+        'profile' => '',
+      ),
+      'text_processing' => 1,
+      'user_register_form' => FALSE,
+    ),
+    'widget' => array(
+      'active' => 1,
+      'module' => 'text',
+      'settings' => array(
+        'rows' => 5,
+      ),
+      'type' => 'text_textarea',
+      'weight' => 7,
+    ),
+  );
+
+  // Exported field_instance: 'node-documentair-field_doc'
+  $field_instances['node-documentair-field_doc'] = array(
+    'bundle' => 'documentair',
+    'default_value' => NULL,
+    'deleted' => 0,
+    'description' => '',
+    'display' => array(
+      'default' => array(
+        'label' => 'above',
+        'module' => 'entityreference',
+        'settings' => array(
+          'link' => FALSE,
+        ),
+        'type' => 'entityreference_label',
+        'weight' => 1,
+      ),
+      'teaser' => array(
+        'label' => 'above',
+        'settings' => array(),
+        'type' => 'hidden',
+        'weight' => 0,
+      ),
+    ),
+    'entity_type' => 'node',
+    'field_name' => 'field_doc',
+    'label' => 'Doc',
+    'required' => 0,
+    'settings' => array(
+      'behaviors' => array(
+        'taxonomy-index' => array(
+          'status' => TRUE,
+        ),
+      ),
+      'entity_translation_sync' => FALSE,
+      'user_register_form' => FALSE,
+    ),
+    'widget' => array(
+      'active' => 1,
+      'module' => 'options',
+      'settings' => array(),
+      'type' => 'options_select',
+      'weight' => 1,
+    ),
+  );
+
+  // Exported field_instance: 'node-documentair-field_thematique'
+  $field_instances['node-documentair-field_thematique'] = array(
+    'bundle' => 'documentair',
+    'default_value' => NULL,
+    'deleted' => 0,
+    'description' => '',
+    'display' => array(
+      'default' => array(
+        'label' => 'above',
+        'module' => 'entityreference',
+        'settings' => array(
+          'link' => FALSE,
+        ),
+        'type' => 'entityreference_label',
+        'weight' => 3,
+      ),
+      'teaser' => array(
+        'label' => 'above',
+        'settings' => array(),
+        'type' => 'hidden',
+        'weight' => 0,
+      ),
+    ),
+    'entity_type' => 'node',
+    'field_name' => 'field_thematique',
+    'label' => 'Thématique',
+    'required' => 0,
+    'settings' => array(
+      'entity_translation_sync' => FALSE,
+      'user_register_form' => FALSE,
+    ),
+    'widget' => array(
+      'active' => 1,
+      'module' => 'entityreference',
+      'settings' => array(
+        'match_operator' => 'CONTAINS',
+        'path' => '',
+        'size' => 60,
+      ),
+      'type' => 'entityreference_autocomplete',
+      'weight' => 2,
+    ),
+  );
+
+  // Exported field_instance: 'node-documentair-field_video'
+  $field_instances['node-documentair-field_video'] = array(
+    'bundle' => 'documentair',
+    'default_value' => NULL,
+    'deleted' => 0,
+    'description' => '',
+    'display' => array(
+      'default' => array(
+        'label' => 'above',
+        'module' => 'video_filter_field',
+        'settings' => array(),
+        'type' => 'video_filter_field_default',
+        'weight' => 2,
+      ),
+      'teaser' => array(
+        'label' => 'above',
+        'settings' => array(),
+        'type' => 'hidden',
+        'weight' => 0,
+      ),
+    ),
+    'entity_type' => 'node',
+    'field_name' => 'field_video',
+    'label' => 'Video',
+    'required' => 0,
+    'settings' => array(
+      'autoplay' => 0,
+      'entity_translation_sync' => FALSE,
+      'max_height' => 400,
+      'max_width' => 400,
+      'user_register_form' => FALSE,
+    ),
+    'widget' => array(
+      'active' => 0,
+      'module' => 'video_filter_field',
+      'settings' => array(),
+      'type' => 'video_filter',
+      'weight' => 6,
+    ),
+  );
+
+  // Exported field_instance: 'node-episode-body'
+  $field_instances['node-episode-body'] = array(
+    'bundle' => 'episode',
+    'default_value' => NULL,
+    'deleted' => 0,
+    'description' => '',
+    'display' => array(
+      'default' => array(
+        'label' => 'hidden',
+        'module' => 'text',
+        'settings' => array(),
+        'type' => 'text_default',
+        'weight' => 0,
+      ),
+      'teaser' => array(
+        'label' => 'hidden',
+        'module' => 'text',
+        'settings' => array(
+          'trim_length' => 600,
+        ),
+        'type' => 'text_summary_or_trimmed',
+        'weight' => 0,
+      ),
+    ),
+    'entity_type' => 'node',
+    'field_name' => 'body',
+    'label' => 'Body',
+    'required' => FALSE,
+    'settings' => array(
+      'display_summary' => TRUE,
+      'entity_translation_sync' => FALSE,
+      'text_processing' => 1,
+      'user_register_form' => FALSE,
+    ),
+    'widget' => array(
+      'module' => 'text',
+      'settings' => array(
+        'rows' => 20,
+        'summary_rows' => 5,
+      ),
+      'type' => 'text_textarea_with_summary',
+      'weight' => 2,
+    ),
+  );
+
+  // Exported field_instance: 'node-episode-field_description'
+  $field_instances['node-episode-field_description'] = array(
+    'bundle' => 'episode',
+    'default_value' => NULL,
+    'deleted' => 0,
+    'description' => '',
+    'display' => array(
+      'default' => array(
+        'label' => 'above',
+        'module' => 'text',
+        'settings' => array(),
+        'type' => 'text_default',
+        'weight' => 2,
+      ),
+      'teaser' => array(
+        'label' => 'above',
+        'settings' => array(),
+        'type' => 'hidden',
+        'weight' => 0,
+      ),
+    ),
+    'entity_type' => 'node',
+    'field_name' => 'field_description',
+    'label' => 'Description',
+    'required' => 0,
+    'settings' => array(
+      'entity_translation_sync' => FALSE,
+      'linkit' => array(
+        'button_text' => 'Recherche',
+        'enable' => 0,
+        'profile' => '',
+      ),
+      'text_processing' => 0,
+      'user_register_form' => FALSE,
+    ),
+    'widget' => array(
+      'active' => 1,
+      'module' => 'text',
+      'settings' => array(
+        'rows' => 5,
+      ),
+      'type' => 'text_textarea',
+      'weight' => 4,
+    ),
+  );
+
+  // Exported field_instance: 'node-episode-field_habiter'
+  $field_instances['node-episode-field_habiter'] = array(
+    'bundle' => 'episode',
+    'default_value' => NULL,
+    'deleted' => 0,
+    'description' => '',
+    'display' => array(
+      'default' => array(
+        'label' => 'above',
+        'module' => 'entityreference',
+        'settings' => array(
+          'link' => FALSE,
+        ),
+        'type' => 'entityreference_label',
+        'weight' => 3,
+      ),
+      'teaser' => array(
+        'label' => 'above',
+        'settings' => array(),
+        'type' => 'hidden',
+        'weight' => 0,
+      ),
+    ),
+    'entity_type' => 'node',
+    'field_name' => 'field_habiter',
+    'label' => 'Habiter',
+    'required' => 0,
+    'settings' => array(
+      'behaviors' => array(
+        'taxonomy-index' => array(
+          'status' => TRUE,
+        ),
+      ),
+      'entity_translation_sync' => FALSE,
+      'user_register_form' => FALSE,
+    ),
+    'widget' => array(
+      'active' => 1,
+      'module' => 'field_extrawidgets',
+      'settings' => array(
+        'display_empty' => 0,
+        'formatter' => 'entityreference_label',
+        'formatter_settings' => array(
+          'link' => 0,
+        ),
+      ),
+      'type' => 'field_extrawidgets_read_only',
+      'weight' => 1,
+    ),
+  );
+
+  // Exported field_instance: 'node-episode-field_thematique'
+  $field_instances['node-episode-field_thematique'] = array(
+    'bundle' => 'episode',
+    'default_value' => NULL,
+    'deleted' => 0,
+    'description' => '',
+    'display' => array(
+      'default' => array(
+        'label' => 'above',
+        'module' => 'entityreference',
+        'settings' => array(
+          'link' => FALSE,
+        ),
+        'type' => 'entityreference_label',
+        'weight' => 4,
+      ),
+      'teaser' => array(
+        'label' => 'above',
+        'settings' => array(),
+        'type' => 'hidden',
+        'weight' => 0,
+      ),
+    ),
+    'entity_type' => 'node',
+    'field_name' => 'field_thematique',
+    'label' => 'Thématique',
+    'required' => 0,
+    'settings' => array(
+      'entity_translation_sync' => FALSE,
+      'user_register_form' => FALSE,
+    ),
+    'widget' => array(
+      'active' => 1,
+      'module' => 'entityreference',
+      'settings' => array(
+        'match_operator' => 'CONTAINS',
+        'path' => '',
+        'size' => 60,
+      ),
+      'type' => 'entityreference_autocomplete',
+      'weight' => 2,
+    ),
+  );
+
+  // Exported field_instance: 'node-episode-field_video'
+  $field_instances['node-episode-field_video'] = array(
+    'bundle' => 'episode',
+    'default_value' => NULL,
+    'deleted' => 0,
+    'description' => '',
+    'display' => array(
+      'default' => array(
+        'label' => 'above',
+        'module' => 'video_filter_field',
+        'settings' => array(),
+        'type' => 'video_filter_field_default',
+        'weight' => 1,
+      ),
+      'teaser' => array(
+        'label' => 'above',
+        'settings' => array(),
+        'type' => 'hidden',
+        'weight' => 0,
+      ),
+    ),
+    'entity_type' => 'node',
+    'field_name' => 'field_video',
+    'label' => 'Video',
+    'required' => 0,
+    'settings' => array(
+      'autoplay' => 0,
+      'entity_translation_sync' => FALSE,
+      'max_height' => 400,
+      'max_width' => 400,
+      'user_register_form' => FALSE,
+    ),
+    'widget' => array(
+      'active' => 0,
+      'module' => 'video_filter_field',
+      'settings' => array(),
+      'type' => 'video_filter',
+      'weight' => 3,
+    ),
+  );
+
+  // Exported field_instance: 'node-thematique-body'
+  $field_instances['node-thematique-body'] = array(
+    'bundle' => 'thematique',
+    'default_value' => NULL,
+    'deleted' => 0,
+    'description' => '',
+    'display' => array(
+      'default' => array(
+        'label' => 'hidden',
+        'module' => 'text',
+        'settings' => array(),
+        'type' => 'text_default',
+        'weight' => 0,
+      ),
+      'teaser' => array(
+        'label' => 'hidden',
+        'module' => 'text',
+        'settings' => array(
+          'trim_length' => 600,
+        ),
+        'type' => 'text_summary_or_trimmed',
+        'weight' => 0,
+      ),
+    ),
+    'entity_type' => 'node',
+    'field_name' => 'body',
+    'label' => 'Body',
+    'required' => FALSE,
+    'settings' => array(
+      'display_summary' => TRUE,
+      'entity_translation_sync' => FALSE,
+      'text_processing' => 1,
+      'user_register_form' => FALSE,
+    ),
+    'widget' => array(
+      'module' => 'text',
+      'settings' => array(
+        'rows' => 20,
+        'summary_rows' => 5,
+      ),
+      'type' => 'text_textarea_with_summary',
+      'weight' => 4,
+    ),
+  );
+
+  // Exported field_instance: 'node-thematique-field_description'
+  $field_instances['node-thematique-field_description'] = array(
+    'bundle' => 'thematique',
+    'default_value' => NULL,
+    'deleted' => 0,
+    'description' => '',
+    'display' => array(
+      'default' => array(
+        'label' => 'above',
+        'module' => 'text',
+        'settings' => array(),
+        'type' => 'text_default',
+        'weight' => 2,
+      ),
+      'teaser' => array(
+        'label' => 'above',
+        'settings' => array(),
+        'type' => 'hidden',
+        'weight' => 0,
+      ),
+    ),
+    'entity_type' => 'node',
+    'field_name' => 'field_description',
+    'label' => 'Description',
+    'required' => 0,
+    'settings' => array(
+      'entity_translation_sync' => FALSE,
+      'linkit' => array(
+        'button_text' => 'Recherche',
+        'enable' => 0,
+        'profile' => '',
+      ),
+      'text_processing' => 1,
+      'user_register_form' => FALSE,
+    ),
+    'widget' => array(
+      'active' => 1,
+      'module' => 'text',
+      'settings' => array(
+        'rows' => 5,
+      ),
+      'type' => 'text_textarea',
+      'weight' => 6,
+    ),
+  );
+
+  // Exported field_instance: 'node-thematique-field_ecouter'
+  $field_instances['node-thematique-field_ecouter'] = array(
+    'bundle' => 'thematique',
+    'default_value' => NULL,
+    'deleted' => 0,
+    'description' => '',
+    'display' => array(
+      'default' => array(
+        'label' => 'above',
+        'module' => 'taxonomy',
+        'settings' => array(),
+        'type' => 'taxonomy_term_reference_link',
+        'weight' => 5,
+      ),
+      'teaser' => array(
+        'label' => 'above',
+        'settings' => array(),
+        'type' => 'hidden',
+        'weight' => 0,
+      ),
+    ),
+    'entity_type' => 'node',
+    'field_name' => 'field_ecouter',
+    'label' => 'Écouter',
+    'required' => 0,
+    'settings' => array(
+      'entity_translation_sync' => FALSE,
+      'user_register_form' => FALSE,
+    ),
+    'widget' => array(
+      'active' => 1,
+      'module' => 'field_extrawidgets',
+      'settings' => array(
+        'display_empty' => 0,
+        'formatter' => 'taxonomy_term_reference_plain',
+        'formatter_settings' => array(),
+      ),
+      'type' => 'field_extrawidgets_read_only',
+      'weight' => 9,
+    ),
+  );
+
+  // Exported field_instance: 'node-thematique-field_episodes'
+  $field_instances['node-thematique-field_episodes'] = array(
+    'bundle' => 'thematique',
+    'default_value' => NULL,
+    'deleted' => 0,
+    'description' => '',
+    'display' => array(
+      'default' => array(
+        'label' => 'above',
+        'module' => 'entityreference',
+        'settings' => array(
+          'link' => FALSE,
+        ),
+        'type' => 'entityreference_label',
+        'weight' => 3,
+      ),
+      'teaser' => array(
+        'label' => 'above',
+        'settings' => array(),
+        'type' => 'hidden',
+        'weight' => 0,
+      ),
+    ),
+    'entity_type' => 'node',
+    'field_name' => 'field_episodes',
+    'label' => 'Épisodes',
+    'required' => 0,
+    'settings' => array(
+      'entity_translation_sync' => FALSE,
+      'user_register_form' => FALSE,
+    ),
+    'widget' => array(
+      'active' => 1,
+      'module' => 'entityreference',
+      'settings' => array(
+        'match_operator' => 'CONTAINS',
+        'path' => '',
+        'size' => 60,
+      ),
+      'type' => 'entityreference_autocomplete',
+      'weight' => 7,
+    ),
+  );
+
+  // Exported field_instance: 'node-thematique-field_video'
+  $field_instances['node-thematique-field_video'] = array(
+    'bundle' => 'thematique',
+    'default_value' => NULL,
+    'deleted' => 0,
+    'description' => '',
+    'display' => array(
+      'default' => array(
+        'label' => 'above',
+        'module' => 'video_filter_field',
+        'settings' => array(),
+        'type' => 'video_filter_field_default',
+        'weight' => 1,
+      ),
+      'teaser' => array(
+        'label' => 'above',
+        'settings' => array(),
+        'type' => 'hidden',
+        'weight' => 0,
+      ),
+    ),
+    'entity_type' => 'node',
+    'field_name' => 'field_video',
+    'label' => 'Video',
+    'required' => 0,
+    'settings' => array(
+      'autoplay' => 0,
+      'entity_translation_sync' => FALSE,
+      'max_height' => 400,
+      'max_width' => 400,
+      'user_register_form' => FALSE,
+    ),
+    'widget' => array(
+      'active' => 0,
+      'module' => 'video_filter_field',
+      'settings' => array(),
+      'type' => 'video_filter',
+      'weight' => 5,
+    ),
+  );
+
+  // Translatables
+  // Included for use with string extractors like potx.
+  t('Body');
+  t('Description');
+  t('Doc');
+  t('Habiter');
+  t('Thématique');
+  t('Video');
+  t('Écouter');
+  t('Épisodes');
+
+  return $field_instances;
+}

+ 51 - 0
sites/all/modules/features/clameurs/clameurs.features.inc

@@ -0,0 +1,51 @@
+<?php
+/**
+ * @file
+ * clameurs.features.inc
+ */
+
+/**
+ * Implements hook_ctools_plugin_api().
+ */
+function clameurs_ctools_plugin_api($module = NULL, $api = NULL) {
+  if ($module == "field_group" && $api == "field_group") {
+    return array("version" => "1");
+  }
+  if ($module == "strongarm" && $api == "strongarm") {
+    return array("version" => "1");
+  }
+}
+
+/**
+ * Implements hook_node_info().
+ */
+function clameurs_node_info() {
+  $items = array(
+    'documentair' => array(
+      'name' => t('Documentair'),
+      'base' => 'node_content',
+      'description' => '',
+      'has_title' => '1',
+      'title_label' => t('Titre'),
+      'help' => '',
+    ),
+    'episode' => array(
+      'name' => t('Épisode'),
+      'base' => 'node_content',
+      'description' => '',
+      'has_title' => '1',
+      'title_label' => t('Titre'),
+      'help' => '',
+    ),
+    'thematique' => array(
+      'name' => t('Thematique'),
+      'base' => 'node_content',
+      'description' => '',
+      'has_title' => '1',
+      'title_label' => t('Titre'),
+      'help' => '',
+    ),
+  );
+  drupal_alter('node_info', $items);
+  return $items;
+}

+ 21 - 0
sites/all/modules/features/clameurs/clameurs.features.taxonomy.inc

@@ -0,0 +1,21 @@
+<?php
+/**
+ * @file
+ * clameurs.features.taxonomy.inc
+ */
+
+/**
+ * Implements hook_taxonomy_default_vocabularies().
+ */
+function clameurs_taxonomy_default_vocabularies() {
+  return array(
+    'actions' => array(
+      'name' => 'Actions',
+      'machine_name' => 'actions',
+      'description' => '',
+      'hierarchy' => 0,
+      'module' => 'taxonomy',
+      'weight' => 0,
+    ),
+  );
+}

+ 291 - 0
sites/all/modules/features/clameurs/clameurs.field_group.inc

@@ -0,0 +1,291 @@
+<?php
+/**
+ * @file
+ * clameurs.field_group.inc
+ */
+
+/**
+ * Implements hook_field_group_info().
+ */
+function clameurs_field_group_info() {
+  $export = array();
+
+  $field_group = new stdClass();
+  $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */
+  $field_group->api_version = 1;
+  $field_group->identifier = 'group_episodes|node|thematique|form';
+  $field_group->group_name = 'group_episodes';
+  $field_group->entity_type = 'node';
+  $field_group->bundle = 'thematique';
+  $field_group->mode = 'form';
+  $field_group->parent_name = 'group_htabs';
+  $field_group->data = array(
+    'label' => 'Épisodes',
+    'weight' => '9',
+    'children' => array(
+      0 => 'field_episodes',
+    ),
+    'format_type' => 'htab',
+    'format_settings' => array(
+      'formatter' => 'closed',
+      'instance_settings' => array(
+        'description' => '',
+        'classes' => 'group-episodes field-group-htab',
+        'required_fields' => 1,
+        'id' => '',
+      ),
+    ),
+  );
+  $export['group_episodes|node|thematique|form'] = $field_group;
+
+  $field_group = new stdClass();
+  $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */
+  $field_group->api_version = 1;
+  $field_group->identifier = 'group_htabs|node|documentair|form';
+  $field_group->group_name = 'group_htabs';
+  $field_group->entity_type = 'node';
+  $field_group->bundle = 'documentair';
+  $field_group->mode = 'form';
+  $field_group->parent_name = '';
+  $field_group->data = array(
+    'label' => 'htabs',
+    'weight' => '3',
+    'children' => array(
+      0 => 'group_texte',
+      1 => 'group_video',
+    ),
+    'format_type' => 'htabs',
+    'format_settings' => array(
+      'formatter' => '',
+      'instance_settings' => array(
+        'classes' => 'group-htabs field-group-htabs',
+      ),
+    ),
+  );
+  $export['group_htabs|node|documentair|form'] = $field_group;
+
+  $field_group = new stdClass();
+  $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */
+  $field_group->api_version = 1;
+  $field_group->identifier = 'group_htabs|node|episode|form';
+  $field_group->group_name = 'group_htabs';
+  $field_group->entity_type = 'node';
+  $field_group->bundle = 'episode';
+  $field_group->mode = 'form';
+  $field_group->parent_name = '';
+  $field_group->data = array(
+    'label' => 'htabs',
+    'weight' => '3',
+    'children' => array(
+      0 => 'group_texte',
+      1 => 'group_video',
+    ),
+    'format_type' => 'htabs',
+    'format_settings' => array(
+      'formatter' => '',
+      'instance_settings' => array(
+        'classes' => 'group-htabs field-group-htabs',
+      ),
+    ),
+  );
+  $export['group_htabs|node|episode|form'] = $field_group;
+
+  $field_group = new stdClass();
+  $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */
+  $field_group->api_version = 1;
+  $field_group->identifier = 'group_htabs|node|thematique|form';
+  $field_group->group_name = 'group_htabs';
+  $field_group->entity_type = 'node';
+  $field_group->bundle = 'thematique';
+  $field_group->mode = 'form';
+  $field_group->parent_name = '';
+  $field_group->data = array(
+    'label' => 'htabs',
+    'weight' => '1',
+    'children' => array(
+      0 => 'group_video',
+      1 => 'group_texte',
+      2 => 'group_episodes',
+    ),
+    'format_type' => 'htabs',
+    'format_settings' => array(
+      'formatter' => '',
+      'instance_settings' => array(
+        'classes' => 'group-htabs field-group-htabs',
+      ),
+    ),
+  );
+  $export['group_htabs|node|thematique|form'] = $field_group;
+
+  $field_group = new stdClass();
+  $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */
+  $field_group->api_version = 1;
+  $field_group->identifier = 'group_texte|node|documentair|form';
+  $field_group->group_name = 'group_texte';
+  $field_group->entity_type = 'node';
+  $field_group->bundle = 'documentair';
+  $field_group->mode = 'form';
+  $field_group->parent_name = 'group_htabs';
+  $field_group->data = array(
+    'label' => 'Texte',
+    'weight' => '4',
+    'children' => array(
+      0 => 'body',
+    ),
+    'format_type' => 'htab',
+    'format_settings' => array(
+      'formatter' => 'closed',
+      'instance_settings' => array(
+        'description' => '',
+        'classes' => 'group-texte field-group-htab',
+        'required_fields' => 1,
+        'id' => '',
+      ),
+    ),
+  );
+  $export['group_texte|node|documentair|form'] = $field_group;
+
+  $field_group = new stdClass();
+  $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */
+  $field_group->api_version = 1;
+  $field_group->identifier = 'group_texte|node|episode|form';
+  $field_group->group_name = 'group_texte';
+  $field_group->entity_type = 'node';
+  $field_group->bundle = 'episode';
+  $field_group->mode = 'form';
+  $field_group->parent_name = 'group_htabs';
+  $field_group->data = array(
+    'label' => 'Texte',
+    'weight' => '9',
+    'children' => array(
+      0 => 'body',
+    ),
+    'format_type' => 'htab',
+    'format_settings' => array(
+      'formatter' => 'closed',
+      'instance_settings' => array(
+        'description' => '',
+        'classes' => 'group-texte field-group-htab',
+        'required_fields' => 1,
+        'id' => '',
+      ),
+    ),
+  );
+  $export['group_texte|node|episode|form'] = $field_group;
+
+  $field_group = new stdClass();
+  $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */
+  $field_group->api_version = 1;
+  $field_group->identifier = 'group_texte|node|thematique|form';
+  $field_group->group_name = 'group_texte';
+  $field_group->entity_type = 'node';
+  $field_group->bundle = 'thematique';
+  $field_group->mode = 'form';
+  $field_group->parent_name = 'group_htabs';
+  $field_group->data = array(
+    'label' => 'Texte',
+    'weight' => '7',
+    'children' => array(
+      0 => 'body',
+    ),
+    'format_type' => 'fieldset',
+    'format_settings' => array(
+      'formatter' => 'collapsible',
+      'instance_settings' => array(
+        'description' => '',
+        'classes' => 'group-texte field-group-fieldset',
+        'required_fields' => 1,
+      ),
+    ),
+  );
+  $export['group_texte|node|thematique|form'] = $field_group;
+
+  $field_group = new stdClass();
+  $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */
+  $field_group->api_version = 1;
+  $field_group->identifier = 'group_video|node|documentair|form';
+  $field_group->group_name = 'group_video';
+  $field_group->entity_type = 'node';
+  $field_group->bundle = 'documentair';
+  $field_group->mode = 'form';
+  $field_group->parent_name = 'group_htabs';
+  $field_group->data = array(
+    'label' => 'Video',
+    'weight' => '5',
+    'children' => array(
+      0 => 'field_video',
+      1 => 'field_description',
+    ),
+    'format_type' => 'htab',
+    'format_settings' => array(
+      'formatter' => 'closed',
+      'instance_settings' => array(
+        'description' => '',
+        'classes' => 'group-video field-group-htab',
+        'required_fields' => 1,
+        'id' => '',
+      ),
+    ),
+  );
+  $export['group_video|node|documentair|form'] = $field_group;
+
+  $field_group = new stdClass();
+  $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */
+  $field_group->api_version = 1;
+  $field_group->identifier = 'group_video|node|episode|form';
+  $field_group->group_name = 'group_video';
+  $field_group->entity_type = 'node';
+  $field_group->bundle = 'episode';
+  $field_group->mode = 'form';
+  $field_group->parent_name = 'group_htabs';
+  $field_group->data = array(
+    'label' => 'Video',
+    'weight' => '10',
+    'children' => array(
+      0 => 'field_video',
+      1 => 'field_description',
+    ),
+    'format_type' => 'htab',
+    'format_settings' => array(
+      'formatter' => 'closed',
+      'instance_settings' => array(
+        'description' => '',
+        'classes' => 'group-video field-group-htab',
+        'required_fields' => 1,
+        'id' => '',
+      ),
+    ),
+  );
+  $export['group_video|node|episode|form'] = $field_group;
+
+  $field_group = new stdClass();
+  $field_group->disabled = FALSE; /* Edit this to true to make a default field_group disabled initially */
+  $field_group->api_version = 1;
+  $field_group->identifier = 'group_video|node|thematique|form';
+  $field_group->group_name = 'group_video';
+  $field_group->entity_type = 'node';
+  $field_group->bundle = 'thematique';
+  $field_group->mode = 'form';
+  $field_group->parent_name = 'group_htabs';
+  $field_group->data = array(
+    'label' => 'Video',
+    'weight' => '8',
+    'children' => array(
+      0 => 'field_video',
+      1 => 'field_description',
+    ),
+    'format_type' => 'htab',
+    'format_settings' => array(
+      'formatter' => 'closed',
+      'instance_settings' => array(
+        'description' => '',
+        'classes' => 'group-video field-group-htab',
+        'required_fields' => 1,
+        'id' => '',
+      ),
+    ),
+  );
+  $export['group_video|node|thematique|form'] = $field_group;
+
+  return $export;
+}

+ 81 - 0
sites/all/modules/features/clameurs/clameurs.info

@@ -0,0 +1,81 @@
+name = Clameurs
+core = 7.x
+package = Clameurs
+dependencies[] = ctools
+dependencies[] = entity
+dependencies[] = entityreference
+dependencies[] = features
+dependencies[] = field_extrawidgets
+dependencies[] = field_group
+dependencies[] = node
+dependencies[] = options
+dependencies[] = page
+dependencies[] = rules
+dependencies[] = strongarm
+dependencies[] = taxonomy
+dependencies[] = text
+dependencies[] = video_filter_field
+features[ctools][] = field_group:field_group:1
+features[ctools][] = strongarm:strongarm:1
+features[features_api][] = api:2
+features[field_base][] = field_description
+features[field_base][] = field_doc
+features[field_base][] = field_ecouter
+features[field_base][] = field_episodes
+features[field_base][] = field_habiter
+features[field_base][] = field_thematique
+features[field_base][] = field_video
+features[field_group][] = group_episodes|node|thematique|form
+features[field_group][] = group_htabs|node|documentair|form
+features[field_group][] = group_htabs|node|episode|form
+features[field_group][] = group_htabs|node|thematique|form
+features[field_group][] = group_texte|node|documentair|form
+features[field_group][] = group_texte|node|episode|form
+features[field_group][] = group_texte|node|thematique|form
+features[field_group][] = group_video|node|documentair|form
+features[field_group][] = group_video|node|episode|form
+features[field_group][] = group_video|node|thematique|form
+features[field_instance][] = node-documentair-body
+features[field_instance][] = node-documentair-field_description
+features[field_instance][] = node-documentair-field_doc
+features[field_instance][] = node-documentair-field_thematique
+features[field_instance][] = node-documentair-field_video
+features[field_instance][] = node-episode-body
+features[field_instance][] = node-episode-field_description
+features[field_instance][] = node-episode-field_habiter
+features[field_instance][] = node-episode-field_thematique
+features[field_instance][] = node-episode-field_video
+features[field_instance][] = node-thematique-body
+features[field_instance][] = node-thematique-field_description
+features[field_instance][] = node-thematique-field_ecouter
+features[field_instance][] = node-thematique-field_episodes
+features[field_instance][] = node-thematique-field_video
+features[node][] = documentair
+features[node][] = episode
+features[node][] = thematique
+features[rules_config][] = clameurs_habiter
+features[rules_config][] = rules_ecouter
+features[rules_config][] = rules_episode_th_matique
+features[taxonomy][] = actions
+features[variable][] = field_bundle_settings_node__documentair
+features[variable][] = field_bundle_settings_node__episode
+features[variable][] = field_bundle_settings_node__thematique
+features[variable][] = language_content_type_documentair
+features[variable][] = language_content_type_episode
+features[variable][] = language_content_type_thematique
+features[variable][] = menu_options_documentair
+features[variable][] = menu_options_episode
+features[variable][] = menu_options_thematique
+features[variable][] = menu_parent_documentair
+features[variable][] = menu_parent_episode
+features[variable][] = menu_parent_thematique
+features[variable][] = node_options_documentair
+features[variable][] = node_options_episode
+features[variable][] = node_options_thematique
+features[variable][] = node_preview_documentair
+features[variable][] = node_preview_episode
+features[variable][] = node_preview_thematique
+features[variable][] = node_submitted_documentair
+features[variable][] = node_submitted_episode
+features[variable][] = node_submitted_thematique
+project path = sites/all/modules/features

+ 7 - 0
sites/all/modules/features/clameurs/clameurs.module

@@ -0,0 +1,7 @@
+<?php
+/**
+ * @file
+ * Code for the Clameurs feature.
+ */
+
+include_once 'clameurs.features.inc';

+ 64 - 0
sites/all/modules/features/clameurs/clameurs.rules_defaults.inc

@@ -0,0 +1,64 @@
+<?php
+/**
+ * @file
+ * clameurs.rules_defaults.inc
+ */
+
+/**
+ * Implements hook_default_rules_configuration().
+ */
+function clameurs_default_rules_configuration() {
+  $items = array();
+  $items['clameurs_habiter'] = entity_import('rules_config', '{ "clameurs_habiter" : {
+      "LABEL" : "Habiter",
+      "PLUGIN" : "reaction rule",
+      "OWNER" : "rules",
+      "REQUIRES" : [ "rules" ],
+      "ON" : { "node_insert--episode" : { "bundle" : "episode" } },
+      "DO" : [
+        { "entity_fetch" : {
+            "USING" : { "type" : "taxonomy_term", "id" : "1" },
+            "PROVIDE" : { "entity_fetched" : { "habiter_term" : "Habiter" } }
+          }
+        },
+        { "data_set" : { "data" : [ "node:field-habiter" ], "value" : [ "habiter-term" ] } }
+      ]
+    }
+  }');
+  $items['rules_ecouter'] = entity_import('rules_config', '{ "rules_ecouter" : {
+      "LABEL" : "\\u00c9couter",
+      "PLUGIN" : "reaction rule",
+      "OWNER" : "rules",
+      "REQUIRES" : [ "rules" ],
+      "ON" : { "node_insert--thematique" : { "bundle" : "thematique" } },
+      "DO" : [
+        { "entity_fetch" : {
+            "USING" : { "type" : "taxonomy_term", "id" : "2" },
+            "PROVIDE" : { "entity_fetched" : { "ecouter_term" : "\\u00c9couter" } }
+          }
+        },
+        { "data_set" : { "data" : [ "node:field-ecouter" ], "value" : [ "ecouter-term" ] } }
+      ]
+    }
+  }');
+  $items['rules_episode_th_matique'] = entity_import('rules_config', '{ "rules_episode_th_matique" : {
+      "LABEL" : "episode-th\\u00e9matique",
+      "PLUGIN" : "reaction rule",
+      "ACTIVE" : false,
+      "OWNER" : "rules",
+      "REQUIRES" : [ "rules" ],
+      "ON" : {
+        "node_update--episode" : { "bundle" : "episode" },
+        "node_insert--episode" : { "bundle" : "episode" }
+      },
+      "DO" : [
+        { "entity_fetch" : {
+            "USING" : { "type" : "node", "id" : [ "node:field-thematique:nid" ] },
+            "PROVIDE" : { "entity_fetched" : { "thematique" : "Th\\u00e9matique" } }
+          }
+        }
+      ]
+    }
+  }');
+  return $items;
+}

+ 215 - 0
sites/all/modules/features/clameurs/clameurs.strongarm.inc

@@ -0,0 +1,215 @@
+<?php
+/**
+ * @file
+ * clameurs.strongarm.inc
+ */
+
+/**
+ * Implements hook_strongarm().
+ */
+function clameurs_strongarm() {
+  $export = array();
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'field_bundle_settings_node__documentair';
+  $strongarm->value = array(
+    'view_modes' => array(),
+    'extra_fields' => array(
+      'form' => array(
+        'title' => array(
+          'weight' => '0',
+        ),
+        'path' => array(
+          'weight' => '8',
+        ),
+        'redirect' => array(
+          'weight' => '9',
+        ),
+      ),
+      'display' => array(),
+    ),
+  );
+  $export['field_bundle_settings_node__documentair'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'field_bundle_settings_node__episode';
+  $strongarm->value = array(
+    'view_modes' => array(),
+    'extra_fields' => array(
+      'form' => array(
+        'title' => array(
+          'weight' => '0',
+        ),
+        'path' => array(
+          'weight' => '4',
+        ),
+        'redirect' => array(
+          'weight' => '5',
+        ),
+      ),
+      'display' => array(),
+    ),
+  );
+  $export['field_bundle_settings_node__episode'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'field_bundle_settings_node__thematique';
+  $strongarm->value = array(
+    'view_modes' => array(),
+    'extra_fields' => array(
+      'form' => array(
+        'title' => array(
+          'weight' => '0',
+        ),
+        'path' => array(
+          'weight' => '2',
+        ),
+        'redirect' => array(
+          'weight' => '3',
+        ),
+      ),
+      'display' => array(),
+    ),
+  );
+  $export['field_bundle_settings_node__thematique'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'language_content_type_documentair';
+  $strongarm->value = '0';
+  $export['language_content_type_documentair'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'language_content_type_episode';
+  $strongarm->value = '0';
+  $export['language_content_type_episode'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'language_content_type_thematique';
+  $strongarm->value = '0';
+  $export['language_content_type_thematique'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'menu_options_documentair';
+  $strongarm->value = array();
+  $export['menu_options_documentair'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'menu_options_episode';
+  $strongarm->value = array();
+  $export['menu_options_episode'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'menu_options_thematique';
+  $strongarm->value = array();
+  $export['menu_options_thematique'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'menu_parent_documentair';
+  $strongarm->value = 'main-menu:0';
+  $export['menu_parent_documentair'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'menu_parent_episode';
+  $strongarm->value = 'main-menu:0';
+  $export['menu_parent_episode'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'menu_parent_thematique';
+  $strongarm->value = 'main-menu:0';
+  $export['menu_parent_thematique'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'node_options_documentair';
+  $strongarm->value = array(
+    0 => 'status',
+  );
+  $export['node_options_documentair'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'node_options_episode';
+  $strongarm->value = array(
+    0 => 'status',
+  );
+  $export['node_options_episode'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'node_options_thematique';
+  $strongarm->value = array(
+    0 => 'status',
+  );
+  $export['node_options_thematique'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'node_preview_documentair';
+  $strongarm->value = '0';
+  $export['node_preview_documentair'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'node_preview_episode';
+  $strongarm->value = '0';
+  $export['node_preview_episode'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'node_preview_thematique';
+  $strongarm->value = '0';
+  $export['node_preview_thematique'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'node_submitted_documentair';
+  $strongarm->value = 0;
+  $export['node_submitted_documentair'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'node_submitted_episode';
+  $strongarm->value = 0;
+  $export['node_submitted_episode'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'node_submitted_thematique';
+  $strongarm->value = 0;
+  $export['node_submitted_thematique'] = $strongarm;
+
+  return $export;
+}