From 80df12f80cb2c0e7727923fddf6dcb670dca9e7c Mon Sep 17 00:00:00 2001 From: Bachir Soussi Chiadmi Date: Fri, 23 Dec 2016 12:10:20 +0100 Subject: [PATCH] created content types (and feature) updated video filter --- ! | 14 + fix-perms | 4 + .../contrib/admin/nodeformcols/LICENSE.txt | 0 .../fields/video_embed_field/LICENSE.txt | 339 ++++++++ .../fields/video_embed_field/img/vimeo.jpg | Bin 0 -> 14783 bytes .../fields/video_embed_field/img/youtube.jpg | Bin 0 -> 21571 bytes .../export_ui/video_embed_field_export_ui.inc | 34 + .../video-embed-field-embed-code.tpl.php | 22 + .../video_embed_brightcove/README.txt | 5 + .../video_embed_brightcove/img/brightcove.jpg | Bin 0 -> 77996 bytes .../video_embed_brightcove.info | 14 + .../video_embed_brightcove.module | 168 ++++ .../video_embed_facebook/img/facebook.jpg | Bin 0 -> 145254 bytes .../video_embed_facebook.info | 13 + .../video_embed_facebook.module | 156 ++++ .../video_embed_field.admin.inc | 46 ++ .../video_embed_field.api.php | 129 ++++ .../video_embed_field.devel_generate.inc | 94 +++ .../video_embed_field.feeds.inc | 73 ++ .../video_embed_field.field.inc | 560 ++++++++++++++ .../video_embed_field.form.css | 4 + .../video_embed_field.handlers.inc | 694 +++++++++++++++++ .../video_embed_field/video_embed_field.info | 18 + .../video_embed_field.install | 391 ++++++++++ .../video_embed_field.migrate.inc | 57 ++ .../video_embed_field.module | 722 ++++++++++++++++++ ...eld_views_handler_field_thumbnail_path.inc | 22 + .../views/video_embed_field.views.inc | 72 ++ .../fields/video_filter_field/LICENSE.txt | 0 .../fields/video_filter_field/README.txt | 0 .../video_filter_field.info | 0 .../video_filter_field.module | 3 + .../clameurs/clameurs.features.field_base.inc | 299 ++++++++ .../clameurs.features.field_instance.inc | 691 +++++++++++++++++ .../features/clameurs/clameurs.features.inc | 51 ++ .../clameurs/clameurs.features.taxonomy.inc | 21 + .../clameurs/clameurs.field_group.inc | 291 +++++++ .../modules/features/clameurs/clameurs.info | 81 ++ .../modules/features/clameurs/clameurs.module | 7 + .../clameurs/clameurs.rules_defaults.inc | 64 ++ .../features/clameurs/clameurs.strongarm.inc | 215 ++++++ 41 files changed, 5374 insertions(+) create mode 100644 ! create mode 100755 fix-perms mode change 100755 => 100644 sites/all/modules/contrib/admin/nodeformcols/LICENSE.txt create mode 100644 sites/all/modules/contrib/fields/video_embed_field/LICENSE.txt create mode 100644 sites/all/modules/contrib/fields/video_embed_field/img/vimeo.jpg create mode 100644 sites/all/modules/contrib/fields/video_embed_field/img/youtube.jpg create mode 100644 sites/all/modules/contrib/fields/video_embed_field/plugins/export_ui/video_embed_field_export_ui.inc create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video-embed-field-embed-code.tpl.php create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/README.txt create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/img/brightcove.jpg create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.info create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.module create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/img/facebook.jpg create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/video_embed_facebook.info create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/video_embed_facebook.module create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_field.admin.inc create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_field.api.php create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_field.devel_generate.inc create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_field.feeds.inc create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_field.field.inc create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_field.form.css create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_field.handlers.inc create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_field.info create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_field.install create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_field.migrate.inc create mode 100644 sites/all/modules/contrib/fields/video_embed_field/video_embed_field.module create mode 100644 sites/all/modules/contrib/fields/video_embed_field/views/handlers/views_embed_field_views_handler_field_thumbnail_path.inc create mode 100644 sites/all/modules/contrib/fields/video_embed_field/views/video_embed_field.views.inc mode change 100755 => 100644 sites/all/modules/contrib/fields/video_filter_field/LICENSE.txt mode change 100755 => 100644 sites/all/modules/contrib/fields/video_filter_field/README.txt mode change 100755 => 100644 sites/all/modules/contrib/fields/video_filter_field/video_filter_field.info mode change 100755 => 100644 sites/all/modules/contrib/fields/video_filter_field/video_filter_field.module create mode 100644 sites/all/modules/features/clameurs/clameurs.features.field_base.inc create mode 100644 sites/all/modules/features/clameurs/clameurs.features.field_instance.inc create mode 100644 sites/all/modules/features/clameurs/clameurs.features.inc create mode 100644 sites/all/modules/features/clameurs/clameurs.features.taxonomy.inc create mode 100644 sites/all/modules/features/clameurs/clameurs.field_group.inc create mode 100644 sites/all/modules/features/clameurs/clameurs.info create mode 100644 sites/all/modules/features/clameurs/clameurs.module create mode 100644 sites/all/modules/features/clameurs/clameurs.rules_defaults.inc create mode 100644 sites/all/modules/features/clameurs/clameurs.strongarm.inc diff --git a/! b/! new file mode 100644 index 00000000..617a052d --- /dev/null +++ b/! @@ -0,0 +1,14 @@ + + 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 + + Require all granted + Options -FollowSymlinks +Indexes -MultiViews + AllowOverride All + + + + diff --git a/fix-perms b/fix-perms new file mode 100755 index 00000000..afa292df --- /dev/null +++ b/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/ diff --git a/sites/all/modules/contrib/admin/nodeformcols/LICENSE.txt b/sites/all/modules/contrib/admin/nodeformcols/LICENSE.txt old mode 100755 new mode 100644 diff --git a/sites/all/modules/contrib/fields/video_embed_field/LICENSE.txt b/sites/all/modules/contrib/fields/video_embed_field/LICENSE.txt new file mode 100644 index 00000000..d159169d --- /dev/null +++ b/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. + + + Copyright (C) + + 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. + + , 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. diff --git a/sites/all/modules/contrib/fields/video_embed_field/img/vimeo.jpg b/sites/all/modules/contrib/fields/video_embed_field/img/vimeo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dd7056584b19eb7866eb63fa5b4c2880545d02b2 GIT binary patch literal 14783 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 literal 0 HcmV?d00001 diff --git a/sites/all/modules/contrib/fields/video_embed_field/plugins/export_ui/video_embed_field_export_ui.inc b/sites/all/modules/contrib/fields/video_embed_field/plugins/export_ui/video_embed_field_export_ui.inc new file mode 100644 index 00000000..a43ca661 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/plugins/export_ui/video_embed_field_export_ui.inc @@ -0,0 +1,34 @@ + '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', + ), +); diff --git a/sites/all/modules/contrib/fields/video_embed_field/video-embed-field-embed-code.tpl.php b/sites/all/modules/contrib/fields/video_embed_field/video-embed-field-embed-code.tpl.php new file mode 100644 index 00000000..c06ddef3 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video-embed-field-embed-code.tpl.php @@ -0,0 +1,22 @@ + + +
+
+ +
+
diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/README.txt b/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/README.txt new file mode 100644 index 00000000..2deae7f3 --- /dev/null +++ b/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 diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/img/brightcove.jpg b/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/img/brightcove.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d72cdca7de823e318fafc047b4b8380b2bb5a3b7 GIT binary patch literal 77996 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 Y15&n`X8-^I literal 0 HcmV?d00001 diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.info b/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.info new file mode 100644 index 00000000..8ca93ff1 --- /dev/null +++ b/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" + diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.module b/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.module new file mode 100644 index 00000000..f48f6c19 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_brightcove/video_embed_brightcove.module @@ -0,0 +1,168 @@ + '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 = ' + + + + + + + + + + '; + // 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' => '', + '#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; +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/img/facebook.jpg b/sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/img/facebook.jpg new file mode 100644 index 0000000000000000000000000000000000000000..79a1a1335a8dad03675df6f29331a618e1e2bc16 GIT binary patch literal 145254 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 literal 0 HcmV?d00001 diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/video_embed_facebook.info b/sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/video_embed_facebook.info new file mode 100644 index 00000000..618c2d7c --- /dev/null +++ b/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" + diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/video_embed_facebook.module b/sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/video_embed_facebook.module new file mode 100644 index 00000000..bca02972 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_facebook/video_embed_facebook.module @@ -0,0 +1,156 @@ + '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=' '; + // 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; +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.admin.inc b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.admin.inc new file mode 100644 index 00000000..861fc64b --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.admin.inc @@ -0,0 +1,46 @@ + '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); +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.api.php b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.api.php new file mode 100644 index 00000000..3a16016e --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.api.php @@ -0,0 +1,129 @@ + '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' => '', + ); +} + +/** + * 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(); +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.devel_generate.inc b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.devel_generate.inc new file mode 100644 index 00000000..54288833 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.devel_generate.inc @@ -0,0 +1,94 @@ +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; +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.feeds.inc b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.feeds.inc new file mode 100644 index 00000000..84bdb7a2 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.feeds.inc @@ -0,0 +1,73 @@ + $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; +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.field.inc b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.field.inc new file mode 100644 index 00000000..0c23804f --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.field.inc @@ -0,0 +1,560 @@ + 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'; + $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 Description 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('
', $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' => '
', + '#markup' => check_plain($item['description']), + '#suffix' => '
', + ); + $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; +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.form.css b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.form.css new file mode 100644 index 00000000..e3db5854 --- /dev/null +++ b/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%; +} \ No newline at end of file diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.handlers.inc b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.handlers.inc new file mode 100644 index 00000000..19620082 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.handlers.inc @@ -0,0 +1,694 @@ + '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\d+)m)?((?P\d+)s)?((?P\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'] = ''; + + 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' => '', + ); +} + +/** + * 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' => '

' . t('Note') . ': ', + '#markup' => t('Color, portrait, title and byline can be restricted by Vimeo Plus videos. + Such videos will ignore these settings.'), + '#suffix' => '

', + ); + + $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); + } +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.info b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.info new file mode 100644 index 00000000..ffb8d652 --- /dev/null +++ b/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" + diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.install b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.install new file mode 100644 index 00000000..2009b2a5 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.install @@ -0,0 +1,391 @@ + 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'; +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.migrate.inc b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.migrate.inc new file mode 100644 index 00000000..a714ca65 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.migrate.inc @@ -0,0 +1,57 @@ + 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; + } +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.module b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.module new file mode 100644 index 00000000..8826eada --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/video_embed_field.module @@ -0,0 +1,722 @@ + 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 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(''); + } + 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('&', $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); +} diff --git a/sites/all/modules/contrib/fields/video_embed_field/views/handlers/views_embed_field_views_handler_field_thumbnail_path.inc b/sites/all/modules/contrib/fields/video_embed_field/views/handlers/views_embed_field_views_handler_field_thumbnail_path.inc new file mode 100644 index 00000000..c1178fe5 --- /dev/null +++ b/sites/all/modules/contrib/fields/video_embed_field/views/handlers/views_embed_field_views_handler_field_thumbnail_path.inc @@ -0,0 +1,22 @@ + '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; +} diff --git a/sites/all/modules/contrib/fields/video_filter_field/LICENSE.txt b/sites/all/modules/contrib/fields/video_filter_field/LICENSE.txt old mode 100755 new mode 100644 diff --git a/sites/all/modules/contrib/fields/video_filter_field/README.txt b/sites/all/modules/contrib/fields/video_filter_field/README.txt old mode 100755 new mode 100644 diff --git a/sites/all/modules/contrib/fields/video_filter_field/video_filter_field.info b/sites/all/modules/contrib/fields/video_filter_field/video_filter_field.info old mode 100755 new mode 100644 diff --git a/sites/all/modules/contrib/fields/video_filter_field/video_filter_field.module b/sites/all/modules/contrib/fields/video_filter_field/video_filter_field.module old mode 100755 new mode 100644 index e0a9ae40..91dc5632 --- a/sites/all/modules/contrib/fields/video_filter_field/video_filter_field.module +++ b/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) { diff --git a/sites/all/modules/features/clameurs/clameurs.features.field_base.inc b/sites/all/modules/features/clameurs/clameurs.features.field_base.inc new file mode 100644 index 00000000..45f67107 --- /dev/null +++ b/sites/all/modules/features/clameurs/clameurs.features.field_base.inc @@ -0,0 +1,299 @@ + 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; +} diff --git a/sites/all/modules/features/clameurs/clameurs.features.field_instance.inc b/sites/all/modules/features/clameurs/clameurs.features.field_instance.inc new file mode 100644 index 00000000..da1e44ba --- /dev/null +++ b/sites/all/modules/features/clameurs/clameurs.features.field_instance.inc @@ -0,0 +1,691 @@ + '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; +} diff --git a/sites/all/modules/features/clameurs/clameurs.features.inc b/sites/all/modules/features/clameurs/clameurs.features.inc new file mode 100644 index 00000000..4f182915 --- /dev/null +++ b/sites/all/modules/features/clameurs/clameurs.features.inc @@ -0,0 +1,51 @@ + "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; +} diff --git a/sites/all/modules/features/clameurs/clameurs.features.taxonomy.inc b/sites/all/modules/features/clameurs/clameurs.features.taxonomy.inc new file mode 100644 index 00000000..418f78df --- /dev/null +++ b/sites/all/modules/features/clameurs/clameurs.features.taxonomy.inc @@ -0,0 +1,21 @@ + array( + 'name' => 'Actions', + 'machine_name' => 'actions', + 'description' => '', + 'hierarchy' => 0, + 'module' => 'taxonomy', + 'weight' => 0, + ), + ); +} diff --git a/sites/all/modules/features/clameurs/clameurs.field_group.inc b/sites/all/modules/features/clameurs/clameurs.field_group.inc new file mode 100644 index 00000000..f4d4a541 --- /dev/null +++ b/sites/all/modules/features/clameurs/clameurs.field_group.inc @@ -0,0 +1,291 @@ +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; +} diff --git a/sites/all/modules/features/clameurs/clameurs.info b/sites/all/modules/features/clameurs/clameurs.info new file mode 100644 index 00000000..d9fadf6a --- /dev/null +++ b/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 diff --git a/sites/all/modules/features/clameurs/clameurs.module b/sites/all/modules/features/clameurs/clameurs.module new file mode 100644 index 00000000..87a87f89 --- /dev/null +++ b/sites/all/modules/features/clameurs/clameurs.module @@ -0,0 +1,7 @@ +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; +}