From 79ea397103e49f7ed38e56e5feee8a77ddb9ee24 Mon Sep 17 00:00:00 2001 From: siwinter Date: Tue, 9 Mar 2021 14:20:00 +0100 Subject: [PATCH 01/74] initial version cloned from github.com/siwinter/mymopidy --- .gitignore | 2 + LICENSE | 677 +----------------- README.md | 132 ++-- README_fr.md | 75 ++ check_process | 38 - check_process.default | 31 + conf/app.conf | 190 +++++ conf/mopidy.conf | 126 ---- conf/nginx.conf | 62 +- conf/raspberry.conf | 7 + conf/systemd.service | 17 + issue_template.md | 55 ++ manifest.json | 62 +- pull_request_template.md | 16 + scripts/.fonctions | 176 ----- scripts/_common.sh | 88 +++ scripts/backup | 81 ++- scripts/change_url | 135 ++++ scripts/install | 332 +++++---- scripts/remove | 114 ++- scripts/restore | 169 +++-- scripts/upgrade | 223 +++++- .../extra_files}/Tryad_Beauty.mp3 | Bin sources/extra_files/app/.gitignore | 2 + sources/extra_files/bbc.opml | 25 + sources/extra_files/mopidy_screenshot1.png | Bin 0 -> 48313 bytes sources/extra_files/mopidyctl | 24 + sources/extra_files/radio_international.m3u | 16 + sources/patches/.gitignore | 2 + sources/patches/__main__.patch | 13 + 30 files changed, 1500 insertions(+), 1390 deletions(-) create mode 100644 .gitignore create mode 100644 README_fr.md delete mode 100644 check_process create mode 100644 check_process.default create mode 100644 conf/app.conf delete mode 100644 conf/mopidy.conf create mode 100644 conf/raspberry.conf create mode 100644 conf/systemd.service create mode 100644 issue_template.md create mode 100644 pull_request_template.md delete mode 100644 scripts/.fonctions create mode 100644 scripts/_common.sh mode change 100644 => 100755 scripts/backup create mode 100644 scripts/change_url mode change 100644 => 100755 scripts/install mode change 100644 => 100755 scripts/remove mode change 100644 => 100755 scripts/restore rename {conf => sources/extra_files}/Tryad_Beauty.mp3 (100%) create mode 100644 sources/extra_files/app/.gitignore create mode 100644 sources/extra_files/bbc.opml create mode 100644 sources/extra_files/mopidy_screenshot1.png create mode 100644 sources/extra_files/mopidyctl create mode 100644 sources/extra_files/radio_international.m3u create mode 100644 sources/patches/.gitignore create mode 100644 sources/patches/__main__.patch diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..783a4ae --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*~ +*.sw[op] diff --git a/LICENSE b/LICENSE index 10926e8..f3cff84 100644 --- a/LICENSE +++ b/LICENSE @@ -1,675 +1,4 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. 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 -them 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 prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. 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. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey 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; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If 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 convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU 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 that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - 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. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -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. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - 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 -state 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 3 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, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program 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, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU 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. But first, please read -. +File containing the license of your package. +More information here: +https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-13---indiquer-la-licence-associ%C3%A9e-au-paquet---brouillon--auto--working- diff --git a/README.md b/README.md index 74e19d0..f3a1c8d 100644 --- a/README.md +++ b/README.md @@ -1,114 +1,92 @@ # Mopidy for YunoHost -[![Integration level](https://dash.yunohost.org/integration/mopidy.svg)](https://dash.yunohost.org/appci/app/mopidy) ![](https://ci-apps.yunohost.org/ci/badges/mopidy.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/mopidy.maintain.svg) +[![Integration level](https://dash.yunohost.org/integration/REPLACEBYYOURAPP.svg)](https://dash.yunohost.org/appci/app/REPLACEBYYOURAPP) ![](https://ci-apps.yunohost.org/ci/badges/REPLACEBYYOURAPP.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/REPLACEBYYOURAPP.maintain.svg) +[![Install REPLACEBYYOURAPP with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=REPLACEBYYOURAPP) -## Mopidy c'est quoi ? +*[Lire ce readme en français.](./README_fr.md)* -Mopidy - est un serveur de musique extensible écrit en Python +> *This package allows you to install Mopidy quickly and simply on a YunoHost server. +If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* -Mopidy joue de la musique à partir de disque local, Spotify, SoundCloud, Google Play Musique, et plus encore. Vous pouvez modifier la liste de lecture à partir d'un téléphone, d'une tablette ou d'un ordinateur en utilisant une gamme de clients MPD et Web. +## Overview +Mopidy - is an extensible music server. +It plays music, podcasts and radio programs from local disk and various streaming services. You edit the playlist from any phone, tablet, or computer. -Source: [mopidy.com](https://www.mopidy.com) +**Shipped version:** 3.1.1 -Vous pouvez installer Mopidy sur un Raspberrypi pour lire de la musique chez vous. Branchez votre Raspberry sur votre système son, sur le bluetooth ou wifi et lancer l'interface web (Mopidy-MusicBox-Webclient) accessible dans l'interface utilisateur de YunoHost. +## Screenshots -Vous pouvez ajouter de nouveaux fichiers sons dans le répertoire suivant -/var/lib/mopidy/media/, pensez à rescanner votre répertoire après l'ajout (voir commandes en dessous). +![](sources/extra_files/mopidy_screenshot1.png) +## Demo -L'application YunoHost vous permet de vous connecter à Spotify (version premium seulement, la version free ne fonctionne pas) ou Soundcloud. +* No demo available -Pour récupérer vos clés pour Spotify et Soundcloud : +## Configuration -[Authentification Mopidy avec les services en ligne](https://www.mopidy.com/authenticate/) +This installation is shipped with various extensions: -Insérer les clés d'authentifications lors de l'installation de l'application. +* [MusicBox-Webclient](https://mopidy.com/ext/musicbox-webclient/) to control mopidy from your web browser -### Vérifier que le sons fonctionne +* [local](https://mopidy.com/ext/local/) to make your private music collection on `/home/yunohost.multimedia/share/Music/` browseable and searchable -Depuis l'interface web, aller dans "Browse" > "File" > "Media". Sur cette page vous avez un morceau qui est importé dans l'application lors de l'installation. Ce titre se nomme "Tryad Beauty", ce morceau est libre de droit. +* [YouTube](https://pypi.org/project/Mopidy-YouTube/) to play sound from YouTube -### Problème pouvant survenir +* [YTMusic](https://music.youtube.com/) to access Google’s streaming music named [YouTube Music](https://music.youtube.com/) +* [Podcast-iTunes](https://mopidy.com/ext/podcast-itunes/) to search and browse podcasts from the Apple iTunes Store. +* [RadioNet](https://mopidy.com/ext/radionet/) to play radio channels from the [radio.net](https://www.radio.net/). -Il se peut que vous n'ayez pas de son, je vous invite à vous renseigner sur [la documentation de Mopidy](https://docs.mopidy.com/en/latest/audio/). +* [Podcast](https://mopidy.com/ext/podcast/) to browse RSS feeds of podcasts and stream the episodes. -### Pour les bidouilleurs +* [Soundcloud](https://pypi.org/project/Mopidy-SoundCloud/) to play music from the [SoundCloud](https://soundcloud.com/) service \([authentication token](https://pypi.org/project/Mopidy-SoundCloud/) needed\). -Vous pouvez arrêter le service depuis la page "Services" dans l'interface d'administration de YunoHost. +* [Raspberry-GPIO](https://mopidy.com/ext/raspberry-gpio/) to control Mopidy from GPIO signals on a Raspberry Pi (only available an ARM-architectures). -Les fichiers de configuration se trouve dans le répertoire /usr/share/mopidy/conf.d +## Documentation -*Les lignes de commandes relative à Mopidy* + * Official documentation: https://docs.mopidy.com/en/latest/ -sudo mopidy local scan -sudo systemctl enable mopidy -sudo systemctl restart mopidy +## YunoHost specific features -Vérifier le statut de Mopidy -`$ sudo systemctl status mopidy` +#### Multi-user support -Relancer Mopidy -`$ sudo systemctl restart mopidy` +Are LDAP and HTTP auth supported? No \ +Can the app be used by multiple users? ?? -Activer ou désactiver Mopidy -`$ sudo systemctl enable mopidy` -`$ sudo systemctl disable mopidy` +#### Supported architectures -Si vous ajoutez de nouveaux fichiers dans le répertoire local, rescanner votre répertoire. -`$ mopidy local scan` +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/REPLACEBYYOURAPP%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/REPLACEBYYOURAPP/) +* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/REPLACEBYYOURAPP%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/REPLACEBYYOURAPP/) -## Why Mopidy? +## Limitations -Mopidy - is an extensible music server written in Python. +* Any known limitations. -Mopidy plays music from local disk, Spotify, SoundCloud, Google Play Music, and more. You edit the playlist from any phone, tablet, or computer using a range of MPD and web clients. +## Additional information -Source: [mopidy.com](https://www.mopidy.com) +To list current settings enter `sudo mopidyctl config` \ +Edit the file `/opt/yunohost/mopidy/mopidy.conf` to adjust mopidy's configuration.\\ -You can install Mopidy on a Raspberrypi to play music at home. Connect your Raspberry on your soundsystem, bluetooth or wifi and launch the web interface (Mopidy-MusicBox-Webclient) in the user interface of YunoHost. +To rebuild the database of your local music collection enter `sudo mopidyctl local scan` -You can add new sound files to the following directory /var/lib/mopidy/media/, think about rescanning your directory after adding it (see commands below). +**More info on the documentation page:** +https://yunohost.org/packaging_apps -The YunoHost application allows you to connect to Spotify (premium version only, free version does not work) or Soundcloud. +## Links -To retrieve your keys for Spotify and Soundcloud: + * Report a bug: https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/issues + * App website: https://mopidy.com/ + * YunoHost website: https://yunohost.org/ -[Mopidy Authentication with Online Services] (https://www.mopidy.com/authenticate/) +--- -Insert authentication keys when installing the application. +## Developer info -### Check that the sounds are working +**Only if you want to use a testing branch for coding, instead of merging directly into master.** +Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/tree/testing). -From the web interface, go to "Browse"> "File"> "Media". On this page you have a song that is imported into the application during installation. This title is called "Tryad Beauty", this piece is free of rights. - -### Troubleshooting - -You may have no sound, check [Mopidy's documentation] (https://docs.mopidy.com/en/latest/audio/). - -### For hackers - -You can stop the service from the "Services" page in the YunoHost administration interface. - -The configuration files can be found in the directory /usr/share/mopidy/conf.d - -*Commandline for Mopidy* - -Check Mopidy's status -`$ sudo systemctl status mopidy` - -Restart Mopidy -`$ sudo systemctl restart mopidy` - -Enable or disable Mopidy -`$ sudo systemctl enable mopidy` -`$ sudo systemctl disable mopidy` - -If you add new files to the local directory, rescan your directory. -`$ mopidy local scan` - -## Versionning - -### Version 1.0.0 (06/03/17) - -- Installation Mopidy and Mopidy-MusicBox-Webclient -- Use Spotify connection -- Use SoundCloud connection +To try the testing branch, please proceed like that. +``` +sudo yunohost app install https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/tree/testing --debug +or +sudo yunohost app upgrade REPLACEBYYOURAPP -u https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/tree/testing --debug +``` diff --git a/README_fr.md b/README_fr.md new file mode 100644 index 0000000..d7d410c --- /dev/null +++ b/README_fr.md @@ -0,0 +1,75 @@ +# App exemple pour YunoHost + +[![Niveau d'intégration](https://dash.yunohost.org/integration/REPLACEBYYOURAPP.svg)](https://dash.yunohost.org/appci/app/REPLACEBYYOURAPP) ![](https://ci-apps.yunohost.org/ci/badges/REPLACEBYYOURAPP.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/REPLACEBYYOURAPP.maintain.svg) +[![Installer REPLACEBYYOURAPP avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=REPLACEBYYOURAPP) + +*[Read this readme in english.](./README.md)* + +> *Ce package vous permet d'installer REPLACEBYYOURAPP rapidement et simplement sur un serveur YunoHost. +Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/#/install) pour apprendre comment l'installer.* + +## Vue d'ensemble +Description rapide de cette application. + +**Version incluse :** 1.0 + +## Captures d'écran + +![](Lien vers une capture d'écran de cette application.) + +## Démo + +* [Démo officielle](Lien vers un site de démonstration de cette application.) + +## Configuration + +Comment configurer cette application : via le panneau d'administration, un fichier brut en SSH ou tout autre moyen. + +## Documentation + + * Documentation officielle : Lien vers la documentation officielle de cette application. + * Documentation YunoHost : Si une documentation spécifique est nécessaire, n'hésitez pas à contribuer. + +## Caractéristiques spécifiques YunoHost + +#### Support multi-utilisateur + +* L'authentification LDAP et HTTP est-elle prise en charge ? +* L'application peut-elle être utilisée par plusieurs utilisateurs ? + +#### Architectures supportées + +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/REPLACEBYYOURAPP%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/REPLACEBYYOURAPP/) +* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/REPLACEBYYOURAPP%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/REPLACEBYYOURAPP/) + +## Limitations + +* Limitations connues. + +## Informations additionnelles + +* Autres informations que vous souhaitez ajouter sur cette application. + +**Plus d'informations sur la page de documentation :** +https://yunohost.org/packaging_apps + +## Liens + + * Signaler un bug : https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/issues + * Site de l'application : Lien vers le site officiel de cette application. + * Dépôt de l'application principale : Lien vers le dépôt officiel de l'application principale. + * Site web YunoHost : https://yunohost.org/ + +--- + +## Informations pour les développeurs + +**Seulement si vous voulez utiliser une branche de test pour le codage, au lieu de fusionner directement dans la banche principale.** +Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/tree/testing). + +Pour essayer la branche testing, procédez comme suit. +``` +sudo yunohost app install https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/tree/testing --debug +ou +sudo yunohost app upgrade REPLACEBYYOURAPP -u https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/tree/testing --debug +``` diff --git a/check_process b/check_process deleted file mode 100644 index d410f1c..0000000 --- a/check_process +++ /dev/null @@ -1,38 +0,0 @@ -;; Test complet sans multisite - auto_remove=1 - ; Manifest - domain="domain.tld" (DOMAIN) - path="/path" (PATH) - admin_mopidy="john" (USER) - spotify_pass="pass" (PASSWORD) - language="fr_FR" - multisite="No" - is_public="Yes" (PUBLIC|public=Yes|private=No) - ; Checks - pkg_linter=1 - setup_sub_dir=1 - setup_root=1 - setup_nourl=0 - setup_private=1 - setup_public=1 - upgrade=1 - backup_restore=1 - multi_instance=1 - wrong_user=1 - wrong_path=1 - incorrect_path=1 - corrupt_source=0 - fail_download_source=0 - port_already_use=0 - final_path_already_use=0 -;;; Levels - Level 1=auto - Level 2=auto - Level 3=auto - Level 4=0 - Level 5=auto - Level 6=auto - Level 7=auto - Level 8=0 - Level 9=0 - Level 10=0 diff --git a/check_process.default b/check_process.default new file mode 100644 index 0000000..866325d --- /dev/null +++ b/check_process.default @@ -0,0 +1,31 @@ +# See here for more information +# https://github.com/YunoHost/package_check#syntax-check_process-file + +# Move this file from check_process.default to check_process when you have filled it. + +;; Test complet + ; Manifest + domain="domain.tld" (DOMAIN) + path="/path" (PATH) + is_public=1 (PUBLIC|public=1|private=0) + ; Checks + pkg_linter=1 + setup_sub_dir=1 + setup_root=1 + setup_nourl=0 + setup_private=1 + setup_public=1 + upgrade=? + upgrade=? from_commit=CommitHash + backup_restore=1 + multi_instance=0 + port_already_use=0 + change_url=1 +;;; Options +Email= +Notification=none +;;; Upgrade options + ; commit=CommitHash + name=Name and date of the commit. + manifest_arg=domain=DOMAIN&path=PATH&is_public=1 + diff --git a/conf/app.conf b/conf/app.conf new file mode 100644 index 0000000..58b1690 --- /dev/null +++ b/conf/app.conf @@ -0,0 +1,190 @@ +# For further information about options in this file see: +# http://docs.mopidy.com/ + +[core] +cache_dir = __CACHE_DIR__ +#config_dir = +data_dir = __DATA_DIR__ +#max_tracklist_length = 10000 +#restore_state = false + +[file] +enabled = true +media_dirs = __MEDIADIR__ +#excluded_file_extensions = +# .directory +# .html +# .jpeg +# .jpg +# .log +# .nfo +# .pdf +# .png +# .txt +# .zip +#show_dotfiles = false +#follow_symlinks = false +#metadata_timeout = 1000 + +[logging] +verbosity = -1 +format = %(levelname)-8s [%(threadName)s] %(name)s %(message)s +#color = false +#config_file = + +[audio] +#mixer = software +mixer_volume = 66 +#output = autoaudiosink +#buffer_time = + +[proxy] +#scheme = +#hostname = +#port = +#username = +#password = + +[musicbox_webclient] +enabled = true +musicbox = false +websocket_host = +websocket_port = +on_track_click = PLAY_ALL + +[http] +enabled = true +hostname = localhost +port = __PORT__ +#zeroconf = Mopidy HTTP server on $hostname +#allowed_origins = +#csrf_protection = true +#default_app = mopidy + +[m3u] +enabled = true +#base_dir = +#default_encoding = latin-1 +#default_extension = .m3u8 +#playlists_dir = + +[softwaremixer] +enabled = true + +[stream] +enabled = true +#protocols = +# http +# https +# mms +# rtmp +# rtmps +# rtsp +#metadata_blacklist = +#timeout = 5000 + +[local] +enabled = true +#max_search_results = 100 +media_dir = __MEDIADIR__ +#scan_timeout = 1000 +#scan_flush_threshold = 100 +#scan_follow_symlinks = false +#included_file_extensions = +#excluded_file_extensions = +# .cue +# .directory +# .html +# .jpeg +# .jpg +# .log +# .nfo +# .pdf +# .png +# .txt +# .zip +#directories = +# Albums local:directory?type=album +# Artists local:directory?type=artist +# Composers local:directory?type=artist&role=composer +# Genres local:directory?type=genre +# Performers local:directory?type=artist&role=performer +# Release Years local:directory?type=date&format=%25Y +# Tracks local:directory?type=track +# Last Week's Updates local:directory?max-age=604800timeout = 10 +#use_artist_sortname = false +#album_art_files = +# *.jpg +# *.jpeg +# *.png + +[youtube] +#enabled = true +#youtube_api_key = +#threads_max = 16 +#search_results = 15 +#playlist_max_videos = 20 +#api_enabled = false +#autoplay_enabled = false +#strict_autoplay = false +#max_autoplay_length = 600 +#max_degrees_of_separation = 3 + +[ytmusic] +#enabled = true +#auth_json = +#auto_playlist_refresh = 60 +#youtube_player_refresh = 15 +#playlist_item_limit = 100 +#subscribed_artist_limit = 100 +#enable_history = true +#enable_liked_songs = true +#enable_mood_genre = true +#enable_scrobbling = true +#stream_preference = +# 141 +# 251 +# 140 +# 250 +# 249 +#verify_track_url = true + +[radionet] +#enabled = true +language = de +#min_bitrate = 128 +favorite_stations = 'bbcworldservice, bbcradio4, bbcradio3, bbcradio2, bbcradio1' + +[podcast-itunes] +enabled = true +base_url = http://itunes.apple.com/ +country = DE +explicit = +charts = audioPodcasts +charts_limit = 20 +search_limit = 20 +timeout = 10 +retries = 3 + +[podcast] +enabled = true +browse_root = __DATA_DIR__/podcast/bbc.opml +#browse_order = desc +#lookup_order = asc +#cache_size = 64 +#cache_ttl = 86400 +#timeout = 10 + +[soundcloud] +# to use soundcloud-extension enter auth_token (see https://mopidy.com/ext/soundcloud/#authentication) +# and set enabled = true +enabled = false +auth_token = ? +#explore_songs = 25 + +#[spotify] +#enabled = true +#username = ? #see https://github.com/mopidy/mopidy-spotify +#password = ? +#client_id = ? +#client_secret = ? diff --git a/conf/mopidy.conf b/conf/mopidy.conf deleted file mode 100644 index 74b9a80..0000000 --- a/conf/mopidy.conf +++ /dev/null @@ -1,126 +0,0 @@ -# For further information about options in this file see: -# http://docs.mopidy.com/ -# -# The initial commented out values reflect the defaults as of: -# Mopidy 2.1.0 -# Mopidy-File 2.1.0 -# Mopidy-HTTP 2.1.0 -# Mopidy-Local 2.1.0 -# Mopidy-M3U 2.1.0 -# Mopidy-MPD 2.1.0 -# Mopidy-SoftwareMixer 2.1.0 -# Mopidy-Stream 2.1.0 -# -# Available options and defaults might have changed since then, -# run `mopidy config` to see the current effective config and -# `mopidy --version` to check the current version. - -[core] -#cache_dir = $XDG_CACHE_DIR/mopidy -#config_dir = $XDG_CONFIG_DIR/mopidy -#data_dir = $XDG_DATA_DIR/mopidy -#max_tracklist_length = 10000 -#restore_state = false - -[logging] -#color = true -#console_format = %(levelname)-8s %(message)s -#debug_format = %(levelname)-8s %(asctime)s [%(process)d:%(threadName)s] %(name)s\n %(message)s -#debug_file = mopidy.log -#config_file = - -[audio] -#mixer = software -#mixer_volume = -#output = autoaudiosink -#buffer_time = - -[proxy] -#scheme = -#hostname = -#port = -#username = -#password = - -[mpd] -enabled = true -hostname = __IPLOCAL__ -port = 6600 -#password = -max_connections = 20 -connection_timeout = 60 -zeroconf = Mopidy MPD server on $hostname -#command_blacklist = -# listall -# listallinfo -default_playlist_scheme = m3u - -[http] -enabled = true -hostname = __IPLOCAL__ -port = 6680 -#static_dir = -zeroconf = Mopidy HTTP server on $hostname - -[stream] -enabled = true -protocols = - http - https - mms - rtmp - rtmps - rtsp -#metadata_blacklist = -timeout = 5000 - -[m3u] -#enabled = true -#base_dir = -#default_encoding = latin-1 -#default_extension = .m3u8 -#playlists_dir = - -[softwaremixer] -#enabled = true - -[file] -#enabled = true -#media_dirs = -# $XDG_MUSIC_DIR|Music -# ~/|Home -#excluded_file_extensions = -# .jpg -# .jpeg -#show_dotfiles = false -#follow_symlinks = false -#metadata_timeout = 1000 - -[local] -enabled = true -library = json -media_dir = /var/lib/mopidy/media -scan_timeout = 1000 -scan_flush_threshold = 100 -scan_follow_symlinks = false -excluded_file_extensions = - .directory - .html - .jpeg - .jpg - .log - .nfo - .png - .txt - -[spotify] -username = __USER_SPOTIFY__ -password = __PWD_SPOTIFY__ -client_id = __ID_SPOTIFY__ -client_secret = __SECRET_SPOTIFY__ -#bitrate = 320 -#timeout = 10 -#cache_dir = $XDG_CACHE_DIR/mopidy/spotify - -[soundcloud] -auth_token = __SOUNDCLOUD__ \ No newline at end of file diff --git a/conf/nginx.conf b/conf/nginx.conf index 36b3862..0d33d43 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,17 +1,61 @@ -location __PATHTOCHANGE__ { - - proxy_pass http://127.0.0.1:6680/mopidy; - proxy_redirect off; +location /mopidy/ws { + + # Force usage of https + if ($scheme = http) { + rewrite ^ https://$server_name$request_uri? permanent; + } + + proxy_pass http://localhost:__PORT__; + proxy_http_version 1.1; proxy_set_header Host $host; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_read_timeout 604800; + proxy_send_timeout 604800; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +} +location __PATH__ { + + # Force usage of https + if ($scheme = http) { + rewrite ^ https://$server_name$request_uri? permanent; + } + + proxy_pass http://localhost:__PORT__/musicbox_webclient; + proxy_http_version 1.1; + proxy_set_header Host $host; + + # Include SSOWAT user panel. + include conf.d/yunohost_panel.conf.inc; } location /musicbox_webclient { + + # Force usage of https + if ($scheme = http) { + rewrite ^ https://$server_name$request_uri? permanent; + } + + proxy_pass http://localhost:6680/musicbox_webclient; + proxy_http_version 1.1; + proxy_set_header Host $host; - proxy_pass http://127.0.0.1:6680/musicbox_webclient; - proxy_redirect off; - proxy_set_header Host $host; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - + # Include SSOWAT user panel. + include conf.d/yunohost_panel.conf.inc; +} + +location /local { + + # Force usage of https + if ($scheme = http) { + rewrite ^ https://$server_name$request_uri? permanent; + } + + proxy_pass http://localhost:6680/local; + proxy_http_version 1.1; + proxy_set_header Host $host; + + # Include SSOWAT user panel. + include conf.d/yunohost_panel.conf.inc; } diff --git a/conf/raspberry.conf b/conf/raspberry.conf new file mode 100644 index 0000000..9fe65a0 --- /dev/null +++ b/conf/raspberry.conf @@ -0,0 +1,7 @@ + +[raspberry-gpio] +enabled = false +bcm5 = play_pause,active_low,250 +bcm6 = volume_down,active_low,250 +bcm16 = next,active_low,250 +bcm20 = volume_up,active_low,250 diff --git a/conf/systemd.service b/conf/systemd.service new file mode 100644 index 0000000..c8d7366 --- /dev/null +++ b/conf/systemd.service @@ -0,0 +1,17 @@ +[Unit] +Description=Mopidy music server +After=avahi-daemon.service +After=dbus.service +After=network.target +After=nss-lookup.target +After=pulseaudio.service +After=remote-fs.target +After=sound.target + +[Service] +User=__APP__ +PermissionsStartOnly=true +ExecStart=__START_FILE__ --config __CONF_FILE__ + +[Install] +WantedBy=multi-user.target diff --git a/issue_template.md b/issue_template.md new file mode 100644 index 0000000..4a290c4 --- /dev/null +++ b/issue_template.md @@ -0,0 +1,55 @@ +--- +name: Bug report +about: When creating a bug report, please use the following template to provide all the relevant information and help debugging efficiently. + +--- + +**How to post a meaningful bug report** +1. *Read this whole template first.* +2. *Determine if you are on the right place:* + - *If you were performing an action on the app from the webadmin or the CLI (install, update, backup, restore, change_url...), you are on the right place!* + - *Otherwise, the issue may be due to REPLACEBYYOURAPP itself. Refer to its documentation or repository for help.* + - *When in doubt, post here and we will figure it out together.* +3. *Delete the italic comments as you write over them below, and remove this guide.* +--- + +### Describe the bug + +*A clear and concise description of what the bug is.* + +### Context + +- Hardware: *VPS bought online / Old laptop or computer / Raspberry Pi at home / Internet Cube with VPN / Other ARM board / ...* +- YunoHost version: x.x.x +- I have access to my server: *Through SSH | through the webadmin | direct access via keyboard / screen | ...* +- Are you in a special context or did you perform some particular tweaking on your YunoHost instance?: *no / yes* + - If yes, please explain: +- Using, or trying to install package version/branch: +- If upgrading, current package version: *can be found in the admin, or with `yunohost app info $app_id`* + +### Steps to reproduce + +- *If you performed a command from the CLI, the command itself is enough. For example:* + ```sh + sudo yunohost app install REPLACEBYYOURAPP + ``` +- *If you used the webadmin, please perform the equivalent command from the CLI first.* +- *If the error occurs in your browser, explain what you did:* + 1. *Go to '...'* + 2. *Click on '...'* + 3. *Scroll down to '...'* + 4. *See error* + +### Expected behavior + +*A clear and concise description of what you expected to happen. You can remove this section if the command above is enough to understand your intent.* + +### Logs + +*When an operation fails, YunoHost provides a simple way to share the logs.* +- *In the webadmin, the error message contains a link to the relevant log page. On that page, you will be able to 'Share with Yunopaste'. If you missed it, the logs of previous operations are also available under Tools > Logs.* +- *In command line, the command to share the logs is displayed at the end of the operation and looks like `yunohost log display [log name] --share`. If you missed it, you can find the log ID of a previous operation using `yunohost log list`.* + +*After sharing the log, please copypaste directly the link provided by YunoHost (to help readability, no need to copypaste the entire content of the log here, just the link is enough...)* + +*If applicable and useful, add screenshots to help explain your problem.* diff --git a/manifest.json b/manifest.json index e460352..2216942 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Mopidy - is an extensible music server written in Python.", "fr": "Mopidy - est un serveur de musique extensible écrit en Python" }, - "version": "1.0.0", + "version": "1.0.2", "url": "https://www.mopidy.com/", "license": "free", "maintainer": { @@ -14,9 +14,9 @@ "email": "cyp@rouquin.me" }, "requirements": { - "yunohost": ">> 2.4.0" + "yunohost": ">= 4.0.8" }, - "multi_instance": true, + "multi_instance": false, "services": [ "nginx" ], @@ -42,59 +42,13 @@ "default": "/mopidy" }, { - "name": "admin_mopidy", - "type": "user", + "name": "is_public", + "type": "boolean", "ask": { - "en": "Choose the Mopidy administrator (must be an existing YunoHost user)", - "fr": "Administrateur de Mopidy (doit être un utilisateur YunoHost existant)" + "en": "Is it a public application?", + "fr": "Est-ce une application publique ?" }, - "example": "johndoe" - }, - { - "name": "spotify_user", - "optional": true, - "ask": { - "en": "User Spotify (Optional field)", - "fr": "Utilisateur Spotify (Champs optionnel)" - }, - "example": "johndoe" - }, - { - "name": "spotify_pass", - "type": "password", - "optional": true, - "ask": { - "en": "Password Spotify (Optional field)", - "fr": "Mot de passe Spotify (Champs optionnel)" - }, - "example": "myreallystrengthpassword" - }, - { - "name": "spotify_id", - "type": "id", - "optional": true, - "ask": { - "en": "Client ID Spotify (Optional field)", - "fr": "ID client Spotify (Champs optionnel)" - } - }, - { - "name": "spotify_id_secret", - "type": "id", - "optional": true, - "ask": { - "en": "Client secret ID Spotify (Optional field)", - "fr": "ID client secret Spotify (Champs optionnel)" - } - }, - { - "name": "soundcloud_id", - "type": "id", - "optional": true, - "ask": { - "en": "Soundcloud ID (Optional field)", - "fr": "ID Soundcloud (Champs optionnel)" - } + "default": true } ] } diff --git a/pull_request_template.md b/pull_request_template.md new file mode 100644 index 0000000..6c28fc5 --- /dev/null +++ b/pull_request_template.md @@ -0,0 +1,16 @@ +## Problem +- *Description of why you made this PR* + +## Solution +- *And how do you fix that problem* + +## PR Status +- [ ] Code finished. +- [ ] Tested with Package_check. +- [ ] Fix or enhancement tested. +- [ ] Upgrade from last version tested. +- [ ] Can be reviewed and tested. + +## Package_check results +--- +* An automatic package_check will be launch at https://ci-apps-dev.yunohost.org/, when you add a specific comment to your Pull Request: "!testme", "!gogogadgetoci" or "By the power of systemd, I invoke The Great App CI to test this Pull Request!"* diff --git a/scripts/.fonctions b/scripts/.fonctions deleted file mode 100644 index 9987538..0000000 --- a/scripts/.fonctions +++ /dev/null @@ -1,176 +0,0 @@ -#!/bin/bash - -ynh_version="2.4" - -YNH_VERSION () { # Renvoi le numéro de version de la moulinette Yunohost - ynh_version=$(sudo yunohost -v | grep "moulinette:" | cut -d' ' -f2 | cut -d'.' -f1,2) -} - -CHECK_VAR () { # Vérifie que la variable n'est pas vide. -# $1 = Variable à vérifier -# $2 = Texte à afficher en cas d'erreur - test -n "$1" || (echo "$2" >&2 && false) -} - -EXIT_PROPERLY () { # Provoque l'arrêt du script en cas d'erreur. Et nettoye les résidus. - trap '' ERR - echo -e "\e[91m \e[1m" # Shell in light red bold - echo -e "!!\n $app install's script has encountered an error. Installation was cancelled.\n!!" >&2 - - if type -t CLEAN_SETUP > /dev/null; then # Vérifie l'existance de la fonction avant de l'exécuter. - CLEAN_SETUP # Appel la fonction de nettoyage spécifique du script install. - fi - - # Compense le bug de ssowat qui ne supprime pas l'entrée de l'app en cas d'erreur d'installation. - # sudo sed -i "\@\"$domain$path/\":@d" /etc/ssowat/conf.json - - if [ "$ynh_version" = "2.2" ]; then - /bin/bash $script_dir/remove # Appel le script remove. En 2.2, ce comportement n'est pas automatique. - fi - - ynh_die -} - -TRAP_ON () { # Activate signal capture - trap EXIT_PROPERLY ERR # Capturing exit signals on error -} - -TRAP_OFF () { # Ignoring signal capture until TRAP_ON - # Pour une raison que j'ignore, la fonction TRAP_ON fonctionne très bien. - # Mais pas la fonction TRAP_OFF... - # Utiliser directement `trap '' ERR` dans le code pour l'utiliser, à la place de la fonction. - trap '' ERR # Ignoring exit signals -} - -CHECK_USER () { # Vérifie la validité de l'user admin -# $1 = Variable de l'user admin. - ynh_user_exists "$1" || (echo "Wrong admin" >&2 && false) -} - -CHECK_DOMAINPATH () { # Vérifie la disponibilité du path et du domaine. - sudo yunohost app checkurl $domain$path -a $app -} - -CHECK_FINALPATH () { # Vérifie que le dossier de destination n'est pas déjà utilisé. - final_path=/var/www/$app - if [ -e "$final_path" ] - then - echo "This path already contains a folder" >&2 - false - fi -} - -### REMOVE SCRIPT - -REMOVE_NGINX_CONF () { # Suppression de la configuration nginx - if [ -e "/etc/nginx/conf.d/$domain.d/$app.conf" ]; then # Delete nginx config - echo "Delete nginx config" - sudo rm "/etc/nginx/conf.d/$domain.d/$app.conf" - sudo service nginx reload - fi -} - -REMOVE_FPM_CONF () { # Suppression de la configuration du pool php-fpm - if [ -e "/etc/php5/fpm/pool.d/$app.conf" ]; then # Delete fpm config - echo "Delete fpm config" - sudo rm "/etc/php5/fpm/pool.d/$app.conf" - fi - if [ -e "/etc/php5/fpm/conf.d/20-$app.ini" ]; then # Delete php config - echo "Delete php config" - sudo rm "/etc/php5/fpm/conf.d/20-$app.ini" - fi - sudo service php5-fpm reload -} - -SECURE_REMOVE () { # Suppression de dossier avec vérification des variables - chaine="$1" # L'argument doit être donné entre quotes simple '', pour éviter d'interpréter les variables. - no_var=0 - while (echo "$chaine" | grep -q '\$') # Boucle tant qu'il y a des $ dans la chaine - do - no_var=1 - global_var=$(echo "$chaine" | cut -d '$' -f 2) # Isole la première variable trouvée. - only_var=\$$(expr "$global_var" : '\([A-Za-z0-9_]*\)') # Isole complètement la variable en ajoutant le $ au début et en gardant uniquement le nom de la variable. Se débarrasse surtout du / et d'un éventuel chemin derrière. - real_var=$(eval "echo ${only_var}") # `eval "echo ${var}` permet d'interpréter une variable contenue dans une variable. - if test -z "$real_var" || [ "$real_var" = "/" ]; then - echo "Variable $only_var is empty, suppression of $chaine cancelled." >&2 - return 1 - fi - chaine=$(echo "$chaine" | sed "s@$only_var@$real_var@") # remplace la variable par sa valeur dans la chaine. - done - if [ "$no_var" -eq 1 ] - then - if [ -e "$chaine" ]; then - echo "Delete directory $chaine" - sudo rm -r "$chaine" - fi - return 0 - else - echo "No detected variable." >&2 - return 1 - fi -} - -# Remove fake package and its dependencies -# -# Dependencies will removed only if no other package need them. -# -# usage: ynh_remove_app_dependencies -ynh_remove_app_dependencies () { - dep_app=${app/_/-} # Replace all '_' by '-' - ynh_package_autoremove ${dep_app}-ynh-deps # Remove the fake package and its dependencies if they not still used. -} - -# Use logrotate to manage the logfile -# -# usage: ynh_use_logrotate [logfile] -# | arg: logfile - absolute path of logfile -# -# If no argument provided, a standard directory will be use. /var/log/${app} -# You can provide a path with the directory only or with the logfile. -# /parentdir/logdir/ -# /parentdir/logdir/logfile.log -# -# It's possible to use this helper several times, each config will added to same logrotate config file. -ynh_use_logrotate () { - if [ "$#" -gt 0 ]; then - if [ "$(echo ${1##*.})" == "log" ]; then # Keep only the extension to check if it's a logfile - logfile=$1 # In this case, focus logrotate on the logfile - else - logfile=$1/.log # Else, uses the directory and all logfile into it. - fi - else - logfile="/var/log/${app}/.log" # Without argument, use a defaut directory in /var/log - fi - cat > ./${app}-logrotate << EOF # Build a config file for logrotate -$logfile { - # Rotate if the logfile exceeds 100Mo - size 100M - # Keep 12 old log maximum - rotate 12 - # Compress the logs with gzip - compress - # Compress the log at the next cycle. So keep always 2 non compressed logs - delaycompress - # Copy and truncate the log to allow to continue write on it. Instead of move the log. - copytruncate - # Do not do an error if the log is missing - missingok - # Not rotate if the log is empty - notifempty - # Keep old logs in the same dir - noolddir -} -EOF - sudo mkdir -p $(dirname "$logfile") # Create the log directory, if not exist - cat ${app}-logrotate | sudo tee -a /etc/logrotate.d/$app > /dev/null # Append this config to the others for this app. If a config file already exist -} - - -# Remove the app's logrotate config. -# -# usage: ynh_remove_logrotate -ynh_remove_logrotate () { - if [ -e "/etc/logrotate.d/$app" ]; then - sudo rm "/etc/logrotate.d/$app" - fi -} \ No newline at end of file diff --git a/scripts/_common.sh b/scripts/_common.sh new file mode 100644 index 0000000..246aead --- /dev/null +++ b/scripts/_common.sh @@ -0,0 +1,88 @@ +#!/bin/bash + +#================================================= +# COMMON VARIABLES +#================================================= +# dependencies used by the app +pkg_dependencies="build-essential python3-dev python3-pip python3-venv git postgresql postgresql-contrib \ + gir1.2-gst-plugins-base-1.0 gir1.2-gstreamer-1.0 gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly lsb-base \ + python3-gst-1.0 python3-tornado (>= 4.4) debconf python3-pkg-resources python3-pykka python3-requests \ + gstreamer1.0-alsa gstreamer1.0-pulseaudio gstreamer1.0-tools" + +#================================================= +# PERSONAL HELPERS +#================================================= + +python_version="$(python3 -V | cut -d' ' -f2 | cut -d. -f1-2)" + +myynh_install() { + ynh_script_progression --message="Install / upgrade mopidy via pip..." --time --weight=1 + python3 -m venv "${final_path}/env" + chown -R "$app" "$final_path" + +#run source in a 'sub shell' + ( + set +o nounset + source "${final_path}/env/bin/activate" + set -o nounset + ynh_exec_as $app $final_path/env/bin/pip install --upgrade --no-cache-dir pip + + ynh_script_progression --message="Installing essentials..." --time --weight=1 + + # to make Gstreamer visible in Python environment + $final_path/env/bin/python3 -m pip install vext + $final_path/env/bin/python3 -m pip install --no-binary=:all: vext.gi + + # install essential packages + ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy==3.1.1 + patch -u $final_path/env/lib/python$python_version/site-packages/mopidy/__main__.py -i ../sources/patches/__main__.patch + + ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-local==3.2.1 + ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-MusicBox-Webclient==3.1.0 + ynh_script_progression --message="Installing Mopidy-YouTube..." --time --weight=1 + ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-YouTube==3.2 + ynh_script_progression --message="Installing Mopidy-YTMusic..." --time --weight=1 + ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-YTMusic==0.2.2 + ynh_script_progression --message="Installing Mopidy-RadioNet..." --time --weight=1 + ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-RadioNet==0.2.2 + ynh_script_progression --message="Installing Mopidy-Podcast..." --time --weight=1 + ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-Podcast==3.0.0 + ynh_script_progression --message="Installing Mopidy-Podcast-iTunes..." --time --weight=1 + ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-Podcast-iTunes==3.0.0 + ynh_script_progression --message="Installing Mopidy-SoundCloud..." --time --time --weight=1 + ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-SoundCloud +# ynh_script_progression --message="Installing Mopidy-Spotify..." --time --weight=1 +# ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-Spotify Spotify Lib currently not available!! + + if [ -n "$(uname -m | grep arm)" ]; # check CPU (raspberry is armxx) + then + ynh_script_progression --message="Installing Mopidy-Raspberry-GPIO..." --time --weight=1 + ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-Raspberry-GPIO + fi + + +# set +o nounset +# source "${final_path}/env/bin/deactivate" +# set -o nounset + ) +} + +#================================================= +# EXPERIMENTAL HELPERS +#================================================= + +#================================================= +# FUTURE OFFICIAL HELPERS +#================================================= + +#================================================= +# YUNOHOST MULTIMEDIA INTEGRATION +#================================================= + +# Install or update the main directory yunohost.multimedia +# see https://github.com/YunoHost-Apps/yunohost.multimedia +ynh_multimedia_build_main_dir () { + wget -nv https://github.com/maniackcrudelis/yunohost.multimedia/archive/master.zip + unzip master.zip + sudo ./yunohost.multimedia-master/script/ynh_media_build.sh +} diff --git a/scripts/backup b/scripts/backup old mode 100644 new mode 100755 index 1ef9b55..23a3c57 --- a/scripts/backup +++ b/scripts/backup @@ -1,22 +1,73 @@ #!/bin/bash -# Exit on command errors and treat unset variables as an error -set -eu +#================================================= +# GENERIC START +#================================================= +# IMPORT GENERIC HELPERS +#================================================= -# Get multi-instances specific variables -app=$YNH_APP_INSTANCE_NAME - -# Source app helpers +# Keep this path for calling _common.sh inside the execution's context of backup and restore scripts +source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers -# Retrieve app settings -domain=$(ynh_app_setting_get "$app" domain) +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= -# Copy the app files -final_path="/opt/${app}" -ynh_backup "$final_path" "sources" 1 +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors -# Copy the nginx conf files -ynh_backup "/etc/nginx/conf.d/${domain}.d/${app}.conf" "nginx.conf" -# Copy service -ynh_backup "/etc/systemd/system/${app}.service" "systemd_${app}.service" \ No newline at end of file +#================================================= +# LOAD SETTINGS +#================================================= +ynh_print_info --message="Loading installation settings..." + +app=$YNH_APP_INSTANCE_NAME + +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +domain=$(ynh_app_setting_get --app=$app --key=domain) +work_dir=$(ynh_app_setting_get --app=$app --key=work_dir) + +# other variables +media_dir="/home/yunohost.multimedia/share/Music" +work_dir="/home/yunohost.app/$app" +cmd_file="/usr/local/bin/mopidyctl" + +#================================================= +# DECLARE DATA AND CONF FILES TO BACKUP +#================================================= +ynh_print_info --message="Declaring files to be backed up..." + +#================================================= +# BACKUP THE APP MAIN DIR +#================================================= + +ynh_backup --src_path="$final_path" + +#================================================= +# BACKUP THE NGINX CONFIGURATION +#================================================= + +ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" + +#================================================= +# SPECIFIC BACKUP +#================================================= +# BACKUP SYSTEMD +#================================================= + +ynh_backup --src_path="/etc/systemd/system/$app.service" + +#================================================= +# BACKUP VARIOUS FILES +#================================================= + +ynh_backup --src_path=$work_dir + +ynh_backup --src_path="$cmd_file" + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_print_info --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." diff --git a/scripts/change_url b/scripts/change_url new file mode 100644 index 0000000..9e5cde1 --- /dev/null +++ b/scripts/change_url @@ -0,0 +1,135 @@ +#!/bin/bash + +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source _common.sh +source /usr/share/yunohost/helpers + +#================================================= +# RETRIEVE ARGUMENTS +#================================================= + +old_domain=$YNH_APP_OLD_DOMAIN +old_path=$YNH_APP_OLD_PATH + +new_domain=$YNH_APP_NEW_DOMAIN +new_path=$YNH_APP_NEW_PATH + +app=$YNH_APP_INSTANCE_NAME + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --time --weight=1 + +# Needed for helper "ynh_add_nginx_config" +final_path=$(ynh_app_setting_get --app=$app --key=path) +port=$(ynh_app_setting_get --app=$app --key=port) + +#================================================= +# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --time --weight=1 + +# Backup the current version of the app +ynh_backup_before_upgrade +ynh_clean_setup () { + # Remove the new domain config file, the remove script won't do it as it doesn't know yet its location. + ynh_secure_remove --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" + + # Restore it if the upgrade fails + ynh_restore_upgradebackup +} +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# CHECK WHICH PARTS SHOULD BE CHANGED +#================================================= + +change_domain=0 +if [ "$old_domain" != "$new_domain" ] +then + change_domain=1 +fi + +change_path=0 +if [ "$old_path" != "$new_path" ] +then + change_path=1 +fi + +#================================================= +# STANDARD MODIFICATIONS +#================================================= +# STOP SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Stopping a systemd service..." --time --weight=1 + +ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/$app.log" + +#================================================= +# MODIFY URL IN NGINX CONF +#================================================= +ynh_script_progression --message="Updating NGINX web server configuration..." --time --weight=1 + +nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf + +# Change the path in the NGINX config file +if [ $change_path -eq 1 ] +then + # Make a backup of the original NGINX config file if modified + ynh_backup_if_checksum_is_different --file="$nginx_conf_path" + # Set global variables for NGINX helper + domain="$old_domain" + path_url="$new_path" + # Create a dedicated NGINX config + ynh_add_nginx_config +fi + +# Change the domain for NGINX +if [ $change_domain -eq 1 ] +then + + # Delete file checksum for the old conf file location + ynh_delete_file_checksum --file="$nginx_conf_path" + mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf + # Store file checksum for the new config file location + ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" + + #adapt permissions for additional URIs + ynh_permission_url --permission="main" --add_url="$new_domain/mopidy/ws" --remove_url="$old_domain/mopidy/ws" + ynh_permission_url --permission="main" --add_url="$new_domain/local" --remove_url="$old_domain/local" + ynh_permission_url --permission="main" --add_url="$new_domain/musicbox_webclient" --remove_url="$old_domain/musicbox_webclient" + +fi +#================================================= +# SPECIFIC MODIFICATIONS +#================================================= +# ... +#================================================= + +#================================================= +# GENERIC FINALISATION +#================================================= +# START SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Starting a systemd service..." --time --weight=1 + +ynh_systemd_action --service_name=$app --action="start" +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --time --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Change of URL completed for $app" --time --last diff --git a/scripts/install b/scripts/install old mode 100644 new mode 100755 index 3bb4835..9b6ec89 --- a/scripts/install +++ b/scripts/install @@ -1,149 +1,239 @@ #!/bin/bash -# Exit on command errors and treat unset variables as an error -set -eu +#================================================= +# GENERIC START +#================================================= +# IMPORT GENERIC HELPERS +#================================================= -source .fonctions # Charge les fonctions génériques habituellement utilisées dans le script +source _common.sh +source /usr/share/yunohost/helpers -TRAP_ON # Active trap pour arrêter le script si une erreur est détectée. +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= + +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# RETRIEVE ARGUMENTS FROM THE MANIFEST +#================================================= domain=$YNH_APP_ARG_DOMAIN -path=$YNH_APP_ARG_PATH -admin_mopidy=$YNH_APP_ARG_ADMIN_MOPIDY -spotify_user=$YNH_APP_ARG_SPOTIFY_USER -spotify_pass=$YNH_APP_ARG_SPOTIFY_PASS -spotify_id=$YNH_APP_ARG_SPOTIFY_ID -spotify_id_secret=$YNH_APP_ARG_SPOTIFY_ID_SECRET -soundcloud_id=$YNH_APP_ARG_SOUNDCLOUD_ID +path_url=$YNH_APP_ARG_PATH +is_public=$YNH_APP_ARG_IS_PUBLIC app=$YNH_APP_INSTANCE_NAME -# Source app helpers -source /usr/share/yunohost/helpers +# other variables +final_path="/opt/yunohost/$app" +media_dir="/home/yunohost.multimedia/share/Music" +work_dir="/home/yunohost.app/$app" +conf_file="$final_path/$app.conf" +cmd_file="/usr/local/bin/mopidyctl" -CHECK_VAR "$app" "app name not set" +#================================================= +# CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS +#================================================= +ynh_script_progression --message="Validating installation parameters..." --time --weight=1 -CHECK_USER "$admin_mopidy" +test ! -e "$final_path" || ynh_die --message="This path already contains a folder" -CHECK_DOMAINPATH +# Check web path availability +ynh_webpath_available $domain $path_url\ + || ynh_die --message="Path not available: ${domain}${path_url}" +ynh_webpath_available $domain "/musicbox_webclient"\ + || ynh_die --message="Path not available: ${domain}/musicbox_webclient" +ynh_webpath_available $domain "/mopidy"\ + || ynh_die --message="Path not available: ${domain}/mopidy" +ynh_webpath_available $domain "/local"\ + || ynh_die --message="Path not available: ${domain}/local" -CHECK_FINALPATH +# Register (book) web path +ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url -ynh_app_setting_set $app domain $domain -ynh_app_setting_set $app path $path -ynh_app_setting_set $app admin $admin_mopidy -if [ -n "$spotify_user" ]; -then - ynh_app_setting_set $app spotify_user $spotify_user - ynh_app_setting_set $app spotify_pass $spotify_pass - ynh_app_setting_set $app spotify_id $spotify_id - ynh_app_setting_set $app spotify_id_secret $spotify_id_secret -fi -if [ -n "$soundcloud_id" ]; -then - ynh_app_setting_set $app soundcloud_id $soundcloud_id +#================================================= +# STORE SETTINGS FROM MANIFEST +#================================================= +ynh_script_progression --message="Storing installation settings..." --time --weight=1 + +ynh_app_setting_set --app=$app --key=domain --value=$domain +ynh_app_setting_set --app=$app --key=path --value=$path_url + +#================================================= +# STANDARD MODIFICATIONS +#================================================= +# FIND AND OPEN A PORT +#================================================= +ynh_script_progression --message="Finding an available port..." --time --weight=1 + +# Find an available port +port=$(ynh_find_port --port=6680) +ynh_app_setting_set --app=$app --key=port --value=$port + +#================================================= +# INSTALL DEPENDENCIES +#================================================= +ynh_script_progression --message="Installing dependencies..." --time --weight=1 + +ynh_install_app_dependencies $pkg_dependencies + +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Configuring system user..." --time --weight=1 + +# Create a system user +ynh_system_user_create --username="$app" --home_dir="$final_path" --use_shell + +#================================================= +# INSTALL MOPIDY IN PYTHON ENVIRONMENT +#================================================= +ynh_script_progression --message="Setting up source files..." --time --weight=1 + +myynh_install + +ynh_app_setting_set --app=$app --key=final_path --value=$final_path + +#================================================= +# NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Configuring NGINX web server..." --time --weight=1 + +# Create a dedicated NGINX config +ynh_add_nginx_config + + +#================================================= +# SPECIFIC SETUP +#================================================= +#================================================= +# CREATE YUNOHOST DIRECTORIES +#================================================= +ynh_script_progression --message="Creating yunohost directories..." --time --weight=1 + +ynh_multimedia_build_main_dir # /home/yunohost.multimedia + +mkdir -p "$work_dir/data" # /home/yunohost.app/mopidy/data +mkdir -p "$work_dir/cache" # /home/yunohost.app/mopidy/cache +chown -R $app: "$work_dir" + +#================================================= +# SETUP SYSTEMD +#================================================= +ynh_script_progression --message="Configuring a systemd service..." --time --weight=1 + +# Create a dedicated systemd config +start_file="$final_path/env/bin/$app" +ynh_add_systemd_config --others_var="conf_file start_file" # substitute __CONF_FILE__ by $conf_file + +#================================================= +# MODIFY A CONFIG FILE +#================================================= +ynh_script_progression --message="Setup config file..." --time --weight=1 + +cp ../conf/app.conf "$conf_file" +if [ -n "$(uname -m | grep arm)" ]; # check CPU (raspberry is armxx) + then + cat ../conf/raspberry.conf >> "$conf_file" fi -# Create final_path and check -sudo mkdir "$final_path" -sudo chown -R www-data: $final_path -ynh_app_setting_set $app final_path $final_path +ynh_replace_string --match_string="__PORT__" --replace_string=$port --target_file="$conf_file" +ynh_replace_string --match_string="__MEDIADIR__" --replace_string=$media_dir --target_file="$conf_file" +ynh_replace_string --match_string="__CACHE_DIR__" --replace_string=$work_dir/cache --target_file="$conf_file" +ynh_replace_string --match_string="__DATA_DIR__" --replace_string=$work_dir/data --target_file="$conf_file" -# Add the archive’s GPG key: -wget -q -O - https://apt.mopidy.com/mopidy.gpg | sudo apt-key add - +#================================================= +# STORE THE CONFIG FILE CHECKSUM +#================================================= -# Add the APT repo to your package sources: -sudo wget -q -O /etc/apt/sources.list.d/mopidy.list https://apt.mopidy.com/jessie.list +ynh_store_file_checksum --file="$conf_file" -# Install Mopidy and all dependencies: -sudo apt-get update -sudo apt-get install -y python-setuptools -sudo apt-get install -y mopidy -sudo apt-get install -y mopidy-soundcloud -sudo apt-get install -y mopidy-spotify +#================================================= +# GENERIC FINALIZATION +#================================================= +# SECURE FILES AND DIRECTORIES +#================================================= -# Copy configuration -ip_local=$(hostname -I | awk '{ print $1 }') -sudo sed -i "s@__IPLOCAL__@$ip_local@g" ../conf/mopidy.conf +# user mopidy needs permission to mkdir on final_path +chown -R root: $final_path +chown $app: $final_path -if [ -n "$spotify_user" ]; -then - sudo sed -i '/\[spotify\]/a enabled = true' ../conf/mopidy.conf - sudo sed -i "s@__USER_SPOTIFY__@$spotify_user@g" ../conf/mopidy.conf - sudo sed -i "s@__PWD_SPOTIFY__@$spotify_pass@g" ../conf/mopidy.conf - sudo sed -i "s@__ID_SPOTIFY__@$spotify_id@g" ../conf/mopidy.conf - sudo sed -i "s@__SECRET_SPOTIFY__@$spotify_id_secret@g" ../conf/mopidy.conf -else - sudo sed -i '/\[spotify\]/a enabled = false' ../conf/mopidy.conf - sudo sed -i "s@__USER_SPOTIFY__@@g" ../conf/mopidy.conf - sudo sed -i "s@__PWD_SPOTIFY__@@g" ../conf/mopidy.conf - sudo sed -i "s@__ID_SPOTIFY__@@g" ../conf/mopidy.conf - sudo sed -i "s@__SECRET_SPOTIFY__@@g" ../conf/mopidy.conf +#================================================= +# INTEGRATE SERVICE IN YUNOHOST +#================================================= +ynh_script_progression --message="Integrating service in YunoHost..." --time --weight=1 + +yunohost service add $app --log_type systemd --description "this is mopidy, a music server" + +#================================================= +# START SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Starting a systemd service..." --time --weight=1 + +# Start a systemd service +ynh_systemd_action --service_name=$app --action="start" + +#================================================= +# SETUP SSOWAT +#================================================= +ynh_script_progression --message="Configuring permissions..." --time --weight=1 + +# Make app public if necessary +if [ $is_public -eq 1 ]; then + ynh_permission_update --permission="main" --add="visitors" fi -if [ -n "$soundcloud_id" ]; -then - sudo sed -i "s@__SOUNDCLOUD__@$soundcloud_id@g" ../conf/mopidy.conf -else - sudo sed -i "s@__SOUNDCLOUD__@@g" ../conf/mopidy.conf +ynh_permission_url --permission="main" --add_url="$domain/mopidy/ws" +ynh_permission_url --permission="main" --add_url="$domain/musicbox_webclient" +#ynh_permission_url --permission="main" --add_url="$domain/local" + +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --time --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# PROVIDE ADDITIONAL SHELL COMAND +#================================================= +ynh_script_progression --message="Provide additional shell comand..." --time --weight=1 + +cp -a ../sources/extra_files/mopidyctl "$cmd_file" +ynh_replace_string --match_string="__APP__" --replace_string=$app --target_file="$cmd_file" +ynh_replace_string --match_string="__FINAL_PATH__" --replace_string=$final_path --target_file="$cmd_file" +ynh_replace_string --match_string="__CONF_FILE__" --replace_string=$conf_file --target_file="$cmd_file" + +chmod +x "$cmd_file" + +#================================================= +# PROVIDE EXAMPLES +#================================================= + +# provide example m3u-playlist +mkdir -p "$work_dir/data/m3u/" +cp -a ../sources/extra_files/radio_international.m3u "$work_dir/data/m3u/radio_international.m3u" + +#provide example podcasts +mkdir -p "$work_dir/data/podcast" +cp -a ../sources/extra_files/bbc.opml "$work_dir/data/podcast/bbc.opml" + +#provide example local music file +if [ "$(ls -A "$media_dir" 2> /dev/null)" == "" ]; then # copy example.mp3 to mediadir if empty (for test purpose) + cp -a ../sources/extra_files/Tryad_Beauty.mp3 "$media_dir" fi -# Copy config nginx -sudo cp ../conf/nginx.conf /etc/nginx/conf.d/$domain.d/$app.conf +#================================================= +# SCAN LOCAL MEDIA DIRECTORY +#================================================= +ynh_script_progression --message="Scan local media directory..." --weight=1 -# Change file configuration for nginx -sudo sed -i "s@__PATHTOCHANGE__@$path@g" /etc/nginx/conf.d/$domain.d/$app.conf +"$cmd_file" local scan -# Check permission for $final_path -sudo chown -R www-data $final_path +#================================================= +# END OF SCRIPT +#================================================= -# Copy config mopidy -sudo cp ../conf/mopidy.conf /usr/share/mopidy/conf.d/ -sudo mkdir -p /root/.config/mopidy -# File required for command line 'mopidy local scan' -sudo cp ../conf/mopidy.conf /root/.config/mopidy/ -# Copy music file for the test -sudo cp ../conf/Tryad_Beauty.mp3 /var/lib/mopidy/media - -# Running Mopidy as a service -sudo mopidy local scan -sudo systemctl enable mopidy -sudo systemctl restart mopidy -sudo systemctl status mopidy - -# Copy library.json -sudo cp /root/.local/share/mopidy/local/library.json.gz /var/lib/mopidy/local/ -sudo chown $app:audio /var/lib/mopidy/local/library.json.gz - -# Running Mopidy again -sudo systemctl restart mopidy -sudo systemctl status mopidy - -# Delete directory and file mopidy configuration -# Mopidy create this directory after install -# but this files create a conflit with a mopidy configuration. -SECURE_REMOVE '/root/.cache/$app' -SECURE_REMOVE '/root/.config/$app' -SECURE_REMOVE '/root/.local/share/$app' - -# Install mopidy-musicbox-webclient -pushd /opt -sudo git clone https://github.com/pimusicbox/mopidy-musicbox-webclient -cd mopidy-musicbox-webclient -sudo python setup.py install -popd - -# Access public for curl -ynh_app_setting_set $app unprotected_uris "/" - -# Reload Nginx -sudo systemctl reload nginx - -# Add Mopidy into YunoHost services -sudo yunohost service add mopidy --log "/var/log/${app}/mopidy.log" - -# Add logrotate -ynh_use_logrotate - -# Reload SSOwat configuration -sudo yunohost app ssowatconf +ynh_script_progression --message="Installation of $app completed" --time --last diff --git a/scripts/remove b/scripts/remove old mode 100644 new mode 100755 index 8098443..76c8ef9 --- a/scripts/remove +++ b/scripts/remove @@ -1,50 +1,92 @@ #!/bin/bash -# Exit on command errors and treat unset variables as an error -set -u +#================================================= +# GENERIC START +#================================================= +# IMPORT GENERIC HELPERS +#================================================= -source .fonctions # Charge les fonctions génériques habituellement utilisées dans le script - -# Source app helpers +source _common.sh source /usr/share/yunohost/helpers -# Get application informations +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --time --weight=1 + app=$YNH_APP_INSTANCE_NAME -domain=$(ynh_app_setting_get $app domain) -# Remove application -sudo apt-get remove --purge -y mopidy -sudo apt-get remove --purge -y mopidy-soundcloud -sudo apt-get remove --purge -y mopidy-spotify +domain=$(ynh_app_setting_get --app=$app --key=domain) +port=$(ynh_app_setting_get --app=$app --key=port) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) -# Delete stupid file -# Normally a root directory is delete with install app -SECURE_REMOVE '/root/.config/$app' -SECURE_REMOVE '/root/.cache/$app' -SECURE_REMOVE '/root/.local/share/$app' -SECURE_REMOVE '/usr/local/bin/$app' -SECURE_REMOVE '/usr/share/$app' -SECURE_REMOVE '/var/lib/$app' -SECURE_REMOVE '/etc/apt/sources.list.d/$app.list' -SECURE_REMOVE '/opt/$app-musicbox-webclient' -SECURE_REMOVE '/var/www/$app' -SECURE_REMOVE '/var/log/$app' -if [ -e "/usr/local/lib/python2.7/dist-packages/Mopidy_MusicBox_Webclient-2.3.0-py2.7.egg" ]; then - sudo rm -fr '/usr/local/lib/python2.7/dist-packages/Mopidy_MusicBox_Webclient-2.3.0-py2.7.egg' -fi -if [ -e "/etc/apt/sources.list.d/mopidy.list" ]; then - sudo rm -fr '/etc/apt/sources.list.d/mopidy.list' +# other variables +cmd_file="/usr/local/bin/mopidyctl" +#================================================= +# STANDARD REMOVE +#================================================= +# REMOVE SERVICE INTEGRATION IN YUNOHOST +#================================================= + +# Remove the service from the list of services known by YunoHost (added from `yunohost service add`) +if ynh_exec_warn_less yunohost service status $app >/dev/null +then + ynh_script_progression --message="Removing $app service integration..." --time --weight=1 + yunohost service remove $app fi -REMOVE_NGINX_CONF # Suppression de la configuration nginx +#================================================= +# STOP AND REMOVE SERVICE +#================================================= +ynh_script_progression --message="Stopping and removing the systemd service..." --time --weight=1 -# remove logrotate -ynh_remove_logrotate +# Remove the dedicated systemd config +ynh_remove_systemd_config -# Régénère la configuration de SSOwat -sudo yunohost app ssowatconf +#================================================= +# REMOVE DEPENDENCIES +#================================================= +ynh_script_progression --message="Removing dependencies..." --time --weight=1 -# reload nginx -sudo systemctl reload nginx +# Remove metapackage and its dependencies +ynh_remove_app_dependencies -echo -e "\e[0m" # Restore normal color \ No newline at end of file +#================================================= +# REMOVE APP MAIN DIR +#================================================= +ynh_script_progression --message="Removing app main directory..." --time --weight=1 + +# Remove the app directory securely +ynh_secure_remove --file="$final_path" + +#================================================= +# REMOVE NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Removing NGINX web server configuration..." --time --weight=1 + +# Remove the dedicated NGINX config +ynh_remove_nginx_config +#================================================= +# SPECIFIC REMOVE +#================================================= +# REMOVE VARIOUS FILES +#================================================= + +# Remove a cron file +ynh_secure_remove --file="$cmd_file" + +#================================================= +# GENERIC FINALIZATION +#================================================= +# REMOVE DEDICATED USER +#================================================= +ynh_script_progression --message="Removing the dedicated system user..." --time --weight=1 + +# Delete a system user +ynh_system_user_delete --username=$app + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Removal of $app completed" --time --last diff --git a/scripts/restore b/scripts/restore old mode 100644 new mode 100755 index 70df11b..0d87224 --- a/scripts/restore +++ b/scripts/restore @@ -1,58 +1,141 @@ #!/bin/bash -# This restore script is adapted to Yunohost >=2.4 -# Exit on command errors and treat unset variables as an error -set -eu +#================================================= +# GENERIC START +#================================================= +# IMPORT GENERIC HELPERS +#================================================= -# The parameter $2 is the id of the app instance ex: ynhexample__2 -app=$YNH_APP_INSTANCE_NAME - -# Source app helpers +# Keep this path for calling _common.sh inside the execution's context of backup and restore scripts +source ../settings/scripts/_common.sh source /usr/share/yunohost/helpers -# Get old parameter of the app -domain=$(ynh_app_setting_get $app domain) -path=$(ynh_app_setting_get $app path) -is_public=$(ynh_app_setting_get $app is_public) +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= -# Check domain/path availability -sudo yunohost app checkurl "${domain}${path}" -a "$app" \ - || ynh_die "Path not available: ${domain}${path}" +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors -# Check $final_path -final_path="/var/www/${app}" -if [ -d $final_path ]; then - ynh_die "There is already a directory: $final_path" -fi +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --time --weight=1 -# Check configuration files nginx -nginx_conf="/etc/nginx/conf.d/${domain}.d/${app}.conf" -if [ -f $nginx_conf ]; then - ynh_die "The NGINX configuration already exists at '${nginx_conf}'. You should safely delete it before restoring this app." +app=$YNH_APP_INSTANCE_NAME -# Check configuration files php-fpm -phpfpm_conf="/etc/php5/fpm/pool.d/${app}.conf" -if [ -f $phpfpm_conf ]; then - ynh_die "The PHP FPM configuration already exists at '${phpfpm_conf}'. You should safely delete it before restoring this app." -fi +domain=$(ynh_app_setting_get --app=$app --key=domain) +path_url=$(ynh_app_setting_get --app=$app --key=path) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) -phpfpm_ini="/etc/php5/fpm/conf.d/20-${app}.ini" -if [ -f $phpfpm_ini ]; then - ynh_die "The PHP FPM INI configuration already exists at '${phpfpm_ini}'. You should safely delete it before restoring this app." -fi +# other variables +media_dir="/home/yunohost.multimedia/share/Music" +work_dir="/home/yunohost.app/$app" +cmd_file="/usr/local/bin/mopidyctl" -# Restore sources & data -sudo cp -a ./sources "$final_path" +#================================================= +# CHECK IF THE APP CAN BE RESTORED +#================================================= +ynh_script_progression --message="Validating restoration parameters..." --time --weight=1 -# Set permissions -sudo chown -R www-data: $final_path +test ! -d $final_path \ + || ynh_die --message="There is already a directory: $final_path " -# Restore nginx configuration files -sudo cp -a ./nginx.conf "$nginx_conf" +# Check web path availability +ynh_webpath_available $domain $path_url\ + || ynh_die --message="Path not available: ${domain}${path_url}" +ynh_webpath_available $domain "/musicbox_webclient"\ + || ynh_die --message="Path not available: ${domain}/musicbox_webclient" +ynh_webpath_available $domain "/mopidy"\ + || ynh_die --message="Path not available: ${domain}/mopidy" +ynh_webpath_available $domain "/local"\ + || ynh_die --message="Path not available: ${domain}/local" -# Restart service and add service into YunoHost -sudo service mopidy restart -sudo yunohost service add mopidy --log "/var/log/mopidy/mopidy.log" +# Register (book) web path +ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url -# Reload services -sudo systemctl reload nginx \ No newline at end of file + +#================================================= +# STANDARD RESTORATION STEPS +#================================================= +# RESTORE THE NGINX CONFIGURATION +#================================================= + +ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" + +#================================================= +# RECREATE THE DEDICATED USER +#================================================= +ynh_script_progression --message="Recreating the dedicated system user..." --time --weight=1 + +# Create the dedicated user (if not existing) +ynh_system_user_create --username="$app" --home_dir="$final_path" --use_shell + +#================================================= +# RESTORE THE APP MAIN DIR +#================================================= +ynh_script_progression --message="Restoring the app main directory..." --time --weight=1 + +ynh_restore_file --origin_path="$final_path" # /opt/yunohost/mopidy + +#================================================= +# RESTORE USER RIGHTS +#================================================= + +# Restore permissions on app files +#chown -R root: $final_path + +#================================================= +# SPECIFIC RESTORATION +#================================================= +# REINSTALL DEPENDENCIES +#================================================= +ynh_script_progression --message="Reinstalling dependencies..." --time --weight=1 + +# Define and install dependencies +ynh_install_app_dependencies $pkg_dependencies + +#================================================= +# RESTORE SYSTEMD +#================================================= +ynh_script_progression --message="Restoring the systemd configuration..." --time --weight=1 + +ynh_restore_file --origin_path="/etc/systemd/system/$app.service" +systemctl enable $app.service --quiet + +#================================================= +# INTEGRATE SERVICE IN YUNOHOST +#================================================= +ynh_script_progression --message="Integrating service in YunoHost..." --time --weight=1 + +yunohost service add $app --log_type systemd --description "this is mopidy, a music server" + +#================================================= +# RESTORE VARIOUS FILES +#================================================= + +ynh_restore_file --origin_path="$work_dir" # /home/yunohost.app/mopidy + +ynh_restore_file --origin_path="$cmd_file" # /usr/local/bin/mopidyctl + +#================================================= +# START SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Starting a systemd service..." --time --weight=1 + +ynh_systemd_action --service_name=$app --action="start" + +#================================================= +# GENERIC FINALIZATION +#================================================= +# RELOAD NGINX AND PHP-FPM +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --time --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Restoration completed for $app" --time --last diff --git a/scripts/upgrade b/scripts/upgrade index 48e3849..4919ef7 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -1,33 +1,214 @@ #!/bin/bash -# Exit on command errors and treat unset variables as an error -set -eu +#================================================= +# GENERIC START +#================================================= +# IMPORT GENERIC HELPERS +#================================================= -source .fonctions # Loads the generic functions usually used in the script -source /usr/share/yunohost/helpers # Source YunoHost helpers +source _common.sh +source /usr/share/yunohost/helpers + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --time --weight=1 -# See comments in install script app=$YNH_APP_INSTANCE_NAME -# Retrieve app settings -domain=$(ynh_app_setting_get "$app" domain) -path=$(ynh_app_setting_get "$app" path) -admin=$(ynh_app_setting_get "$app" admin) +domain=$(ynh_app_setting_get --app=$app --key=domain) +path_url=$(ynh_app_setting_get --app=$app --key=path) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +port=$(ynh_app_setting_get --app=$app --key=port) -CHECK_PATH # Checks and corrects the syntax of the path. +# other variables +media_dir="/home/yunohost.multimedia/share/Music" +work_dir="/home/yunohost.app/$app" +conf_file="$final_path/$app.conf" +cmd_file="/usr/local/bin/mopidyctl" -# Check if admin is not null -if [[ "$admin" = "" ]]; then - echo "Unable to upgrade, please contact support" - ynh_die + +#================================================= +# CHECK VERSION +#================================================= + +### This helper will compare the version of the currently installed app and the version of the upstream package. +### $upgrade_type can have 2 different values +### - UPGRADE_APP if the upstream app version has changed +### - UPGRADE_PACKAGE if only the YunoHost package has changed +### ynh_check_app_version_changed will stop the upgrade if the app is up to date. +### UPGRADE_APP should be used to upgrade the core app only if there's an upgrade to do. +upgrade_type=$(ynh_check_app_version_changed) + +#================================================= +# ENSURE DOWNWARD COMPATIBILITY +#================================================= +ynh_script_progression --message="Ensuring downward compatibility..." --time --weight=1 + +# +# N.B. : the followings setting migrations snippets are provided as *EXAMPLES* +# of what you may want to do in some cases (e.g. a setting was not defined on +# some legacy installs and you therefore want to initiaze stuff during upgrade) +# + +# If db_name doesn't exist, create it +#if [ -z "$db_name" ]; then +# db_name=$(ynh_sanitize_dbid --db_name=$app) +# ynh_app_setting_set --app=$app --key=db_name --value=$db_name +#fi + +# If final_path doesn't exist, create it +#if [ -z "$final_path" ]; then +# final_path=/var/www/$app +# ynh_app_setting_set --app=$app --key=final_path --value=$final_path +#fi + +### If nobody installed your app before 4.1, +### then you may safely remove these lines + +#================================================= +# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." --time --weight=1 + +# Backup the current version of the app +ynh_backup_before_upgrade +ynh_clean_setup () { + # Restore it if the upgrade fails + ynh_restore_upgradebackup +} +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# STANDARD UPGRADE STEPS +#================================================= +# STOP SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Stopping a systemd service..." --time --weight=1 + +ynh_systemd_action --service_name=$app --action="stop" + +#================================================= +# DOWNLOAD, CHECK AND UNPACK SOURCE +#================================================= + +# siwi: to be checked + +if [ "$upgrade_type" == "UPGRADE_APP" ] +then + myynh_install fi -final_path=/var/www/$app +#================================================= +# NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Upgrading NGINX web server configuration..." --time --weight=1 -# Modify Nginx configuration file and copy it to Nginx conf directory -sed -i "s@__PATHTOCHANGE__@$app@g" ../conf/nginx.conf* -sed -i "s@__FINALPATH__@$final_path/@g" ../conf/nginx.conf* -sed -i "s@__DOMAINNAME__@$domain/@g" ../conf/nginx.conf* +# Create a dedicated NGINX config +ynh_add_nginx_config -# Reload Nginx -sudo systemctl reload nginx \ No newline at end of file +#================================================= +# UPGRADE DEPENDENCIES +#================================================= +ynh_script_progression --message="Upgrading dependencies..." --time --weight=1 + +ynh_install_app_dependencies $pkg_dependencies + +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Making sure dedicated system user exists..." --time --weight=1 + +# Create a dedicated user (if not existing) +ynh_system_user_create --username="$app" --home_dir="$final_path" --use_shell + +#================================================= +# SPECIFIC UPGRADE +#================================================= +# SETUP SYSTEMD +#================================================= +ynh_script_progression --message="Upgrading systemd configuration..." --time --weight=1 + +# Create a dedicated systemd config +start_file="$final_path/env/bin/$app" +ynh_add_systemd_config --others_var="conf_file start_file" # substitute __CONF_FILE__ by $conf_file + +#================================================= +# MODIFY A CONFIG FILE +#================================================= +#siwi : to be checked + +### Verify the checksum of a file, stored by `ynh_store_file_checksum` in the install script. +### And create a backup of this file if the checksum is different. So the file will be backed up if the admin had modified it. +ynh_backup_if_checksum_is_different --file="$conf_file" + + +cp ../conf/app.conf "$conf_file" +if [ -n "$(uname -m | grep arm)" ]; # check CPU (raspberry is armxx) + then + cat ../conf/raspberry.conf >> "$conf_file" +fi + +ynh_replace_string --match_string="__PORT__" --replace_string=$port --target_file="$conf_file" +ynh_replace_string --match_string="__MEDIADIR__" --replace_string=$media_dir --target_file="$conf_file" +ynh_replace_string --match_string="__CACHE_DIR__" --replace_string=$work_dir/cache --target_file="$conf_file" +ynh_replace_string --match_string="__DATA_DIR__" --replace_string=$work_dir/data --target_file="$conf_file" + +# Recalculate and store the checksum of the file for the next upgrade. +ynh_store_file_checksum --file="$conf_file" + +#================================================= +# GENERIC FINALIZATION +#================================================= +# SECURE FILES AND DIRECTORIES +#================================================= +# siwi : to be checked + +# Set permissions on app files +chown -R root: $final_path + +#================================================= +# INTEGRATE SERVICE IN YUNOHOST +#================================================= +ynh_script_progression --message="Integrating service in YunoHost..." --time --weight=1 + +yunohost service add $app --log_type systemd --description "this is mopidy, a music server" +#================================================= +# START SYSTEMD SERVICE +#================================================= +ynh_script_progression --message="Starting a systemd service..." --time --weight=1 + +ynh_systemd_action --service_name=$app --action="start" + +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --time --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# PROVIDE ADDITIONAL SHELL COMAND +#================================================= +ynh_script_progression --message="Provide additional shell comand..." --time --weight=1 + +cp -a ../sources/extra_files/mopidyctl "$cmd_file" +ynh_replace_string --match_string="__APP__" --replace_string=$app --target_file="$cmd_file" +ynh_replace_string --match_string="__FINAL_PATH__" --replace_string=$final_path --target_file="$cmd_file" +ynh_replace_string --match_string="__CONF_FILE__" --replace_string=$conf_file --target_file="$cmd_file" + +chmod +x "$cmd_file" + +#================================================= +# SCAN LOCAL MEDIA DIRECTORY +#================================================= +ynh_script_progression --message="Scan local media directory..." --weight=1 + +"$cmd_file" local scan + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Upgrade of $app completed" --time --last diff --git a/conf/Tryad_Beauty.mp3 b/sources/extra_files/Tryad_Beauty.mp3 similarity index 100% rename from conf/Tryad_Beauty.mp3 rename to sources/extra_files/Tryad_Beauty.mp3 diff --git a/sources/extra_files/app/.gitignore b/sources/extra_files/app/.gitignore new file mode 100644 index 0000000..783a4ae --- /dev/null +++ b/sources/extra_files/app/.gitignore @@ -0,0 +1,2 @@ +*~ +*.sw[op] diff --git a/sources/extra_files/bbc.opml b/sources/extra_files/bbc.opml new file mode 100644 index 0000000..2dcf370 --- /dev/null +++ b/sources/extra_files/bbc.opml @@ -0,0 +1,25 @@ + + + + Podcast Feeds + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sources/extra_files/mopidy_screenshot1.png b/sources/extra_files/mopidy_screenshot1.png new file mode 100644 index 0000000000000000000000000000000000000000..dbddb2e06ff95868a126e5ca12d5fb526d087091 GIT binary patch literal 48313 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 LWyuP0qk#VdZsKLY literal 0 HcmV?d00001 diff --git a/sources/extra_files/mopidyctl b/sources/extra_files/mopidyctl new file mode 100644 index 0000000..6d8210b --- /dev/null +++ b/sources/extra_files/mopidyctl @@ -0,0 +1,24 @@ +#!/bin/sh + +SELF=$(basename $0) +DAEMON="__FINAL_PATH__/env/bin/mopidy" +DAEMON_USER="__APP__" +CONFIG_FILES="__CONF_FILE__" +CMD="$DAEMON --config $CONFIG_FILES $@" + +if [ $# -eq 0 ]; then + echo "Usage: $SELF [options]" 1>&2 + echo "Examples:" 1>&2 + echo " $SELF --help" 1>&2 + echo " $SELF config" 1>&2 + echo " $SELF local scan" 1>&2 + exit 1 +fi + +if [ $(id -u) -ne 0 ]; then + echo "$SELF must be run as root" 1>&2 + exit 2 +fi + +echo "Running \"$CMD\" as user $DAEMON_USER" 1>&2 +su -s /bin/sh -c "$CMD" -- $DAEMON_USER diff --git a/sources/extra_files/radio_international.m3u b/sources/extra_files/radio_international.m3u new file mode 100644 index 0000000..29eb71b --- /dev/null +++ b/sources/extra_files/radio_international.m3u @@ -0,0 +1,16 @@ +#EXTM3U +#RADIOBROWSERUUID:b10a6f62-9fb8-11e8-a767-52543be04c81 +#EXTINF:1,bbc world service +http://bbcwssc.ic.llnwd.net/stream/bbcwssc_mp1_ws-einws + +#RADIOBROWSERUUID:242a99da-f2af-11e9-a96c-52543be04c81 +#EXTINF:1,A23 FRANCE. INTER +http://direct.franceinter.fr/live/franceinter-midfi.mp3 + +#RADIOBROWSERUUID:2367e7e2-d3f2-11e9-a861-52543be04c81 +#EXTINF:1,Radio Nacional de España RNE 1 +http://rne.rtveradio.cires21.com/rne_hc.mp3 + +#RADIOBROWSERUUID:bb91a2bb-8df9-11e9-a6c6-52543be04c81 +#EXTINF:1,Deutschlandfunk +http://st01.dlf.de/dlf/01/64/mp3/stream.mp3 diff --git a/sources/patches/.gitignore b/sources/patches/.gitignore new file mode 100644 index 0000000..783a4ae --- /dev/null +++ b/sources/patches/.gitignore @@ -0,0 +1,2 @@ +*~ +*.sw[op] diff --git a/sources/patches/__main__.patch b/sources/patches/__main__.patch new file mode 100644 index 0000000..44f53dd --- /dev/null +++ b/sources/patches/__main__.patch @@ -0,0 +1,13 @@ +--- b/__main__.py 2021-03-05 13:01:10.485858343 +0100 ++++ a/__main__.py 2021-03-05 13:03:11.807808195 +0100 +@@ -20,6 +20,7 @@ + pass + + ++logging.getLogger().handlers.clear() + logger = logging.getLogger(__name__) + + + + + From ea2ef95fcf26ff5d9bf3883d69f8342063bc52fb Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Tue, 9 Mar 2021 17:35:22 +0100 Subject: [PATCH 02/74] remove raspberry-gpio extension --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index f3a1c8d..6c6f73a 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,6 @@ This installation is shipped with various extensions: * [Soundcloud](https://pypi.org/project/Mopidy-SoundCloud/) to play music from the [SoundCloud](https://soundcloud.com/) service \([authentication token](https://pypi.org/project/Mopidy-SoundCloud/) needed\). -* [Raspberry-GPIO](https://mopidy.com/ext/raspberry-gpio/) to control Mopidy from GPIO signals on a Raspberry Pi (only available an ARM-architectures). - ## Documentation * Official documentation: https://docs.mopidy.com/en/latest/ From 0e2d38aa409b0188a6e8aabce72129a64af626fa Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Tue, 9 Mar 2021 17:37:25 +0100 Subject: [PATCH 03/74] remove raspberry-gpio extension --- scripts/_common.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 246aead..30c7cc4 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -54,11 +54,11 @@ myynh_install() { # ynh_script_progression --message="Installing Mopidy-Spotify..." --time --weight=1 # ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-Spotify Spotify Lib currently not available!! - if [ -n "$(uname -m | grep arm)" ]; # check CPU (raspberry is armxx) - then - ynh_script_progression --message="Installing Mopidy-Raspberry-GPIO..." --time --weight=1 - ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-Raspberry-GPIO - fi +# if [ -n "$(uname -m | grep arm)" ]; # check CPU (raspberry is armxx) +# then +# ynh_script_progression --message="Installing Mopidy-Raspberry-GPIO..." --time --weight=1 +# ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-Raspberry-GPIO +# fi # set +o nounset From dccde83e079fe4553703923992f5eff0c1ab3120 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Tue, 9 Mar 2021 17:41:16 +0100 Subject: [PATCH 04/74] remove raspberry-gpio extension --- scripts/install | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/install b/scripts/install index 9b6ec89..13fa6fb 100755 --- a/scripts/install +++ b/scripts/install @@ -134,10 +134,10 @@ ynh_add_systemd_config --others_var="conf_file start_file" # substitute __CO ynh_script_progression --message="Setup config file..." --time --weight=1 cp ../conf/app.conf "$conf_file" -if [ -n "$(uname -m | grep arm)" ]; # check CPU (raspberry is armxx) - then - cat ../conf/raspberry.conf >> "$conf_file" -fi +#if [ -n "$(uname -m | grep arm)" ]; # check CPU (raspberry is armxx) +# then +# cat ../conf/raspberry.conf >> "$conf_file" +#fi ynh_replace_string --match_string="__PORT__" --replace_string=$port --target_file="$conf_file" ynh_replace_string --match_string="__MEDIADIR__" --replace_string=$media_dir --target_file="$conf_file" From dab4b90e42ca33cb3de12aaf58903e32de77b045 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Tue, 9 Mar 2021 17:42:56 +0100 Subject: [PATCH 05/74] Update upgrade --- scripts/upgrade | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 4919ef7..7a7f503 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -145,10 +145,10 @@ ynh_backup_if_checksum_is_different --file="$conf_file" cp ../conf/app.conf "$conf_file" -if [ -n "$(uname -m | grep arm)" ]; # check CPU (raspberry is armxx) - then - cat ../conf/raspberry.conf >> "$conf_file" -fi +#if [ -n "$(uname -m | grep arm)" ]; # check CPU (raspberry is armxx) +# then +# cat ../conf/raspberry.conf >> "$conf_file" +#fi ynh_replace_string --match_string="__PORT__" --replace_string=$port --target_file="$conf_file" ynh_replace_string --match_string="__MEDIADIR__" --replace_string=$media_dir --target_file="$conf_file" From 5729e42df1a79909b67e7309d154f6c64c066f77 Mon Sep 17 00:00:00 2001 From: siwinter Date: Wed, 10 Mar 2021 00:33:24 +0100 Subject: [PATCH 06/74] fix URI permissions --- scripts/install | 12 +----------- scripts/restore | 4 ---- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/scripts/install b/scripts/install index 13fa6fb..8990db5 100755 --- a/scripts/install +++ b/scripts/install @@ -40,16 +40,6 @@ ynh_script_progression --message="Validating installation parameters..." --time test ! -e "$final_path" || ynh_die --message="This path already contains a folder" -# Check web path availability -ynh_webpath_available $domain $path_url\ - || ynh_die --message="Path not available: ${domain}${path_url}" -ynh_webpath_available $domain "/musicbox_webclient"\ - || ynh_die --message="Path not available: ${domain}/musicbox_webclient" -ynh_webpath_available $domain "/mopidy"\ - || ynh_die --message="Path not available: ${domain}/mopidy" -ynh_webpath_available $domain "/local"\ - || ynh_die --message="Path not available: ${domain}/local" - # Register (book) web path ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url @@ -187,7 +177,7 @@ fi ynh_permission_url --permission="main" --add_url="$domain/mopidy/ws" ynh_permission_url --permission="main" --add_url="$domain/musicbox_webclient" -#ynh_permission_url --permission="main" --add_url="$domain/local" +ynh_permission_url --permission="main" --add_url="$domain/local" #================================================= # RELOAD NGINX diff --git a/scripts/restore b/scripts/restore index 0d87224..a8017a8 100755 --- a/scripts/restore +++ b/scripts/restore @@ -51,10 +51,6 @@ ynh_webpath_available $domain "/mopidy"\ ynh_webpath_available $domain "/local"\ || ynh_die --message="Path not available: ${domain}/local" -# Register (book) web path -ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url - - #================================================= # STANDARD RESTORATION STEPS #================================================= From 8fc8f4f421e65cff2d471544ceb87682c8a4fc3e Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Wed, 17 Mar 2021 20:40:41 +0100 Subject: [PATCH 07/74] initial version --- README_fr.md | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/README_fr.md b/README_fr.md index d7d410c..d147cad 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,21 +1,23 @@ -# App exemple pour YunoHost +# Mopidy pour YunoHost [![Niveau d'intégration](https://dash.yunohost.org/integration/REPLACEBYYOURAPP.svg)](https://dash.yunohost.org/appci/app/REPLACEBYYOURAPP) ![](https://ci-apps.yunohost.org/ci/badges/REPLACEBYYOURAPP.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/REPLACEBYYOURAPP.maintain.svg) [![Installer REPLACEBYYOURAPP avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=REPLACEBYYOURAPP) *[Read this readme in english.](./README.md)* -> *Ce package vous permet d'installer REPLACEBYYOURAPP rapidement et simplement sur un serveur YunoHost. +> *Ce package vous permet d'installer Mopidy rapidement et simplement sur un serveur YunoHost. Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/#/install) pour apprendre comment l'installer.* ## Vue d'ensemble -Description rapide de cette application. +Mopidy - est un serveur de musique extensible. +Mopidy lit de la musique, des podcasts et des programmes de radio à partir d'un disque local et de divers services de streaming. +Vous pouvez modifier la liste de lecture à partir d'un téléphone, d'une tablette ou d'un ordinateur. -**Version incluse :** 1.0 +**Version incluse :** 3.1.1 ## Captures d'écran -![](Lien vers une capture d'écran de cette application.) +![](sources/extra_files/mopidy_screenshot1.png) ## Démo @@ -23,18 +25,26 @@ Description rapide de cette application. ## Configuration -Comment configurer cette application : via le panneau d'administration, un fichier brut en SSH ou tout autre moyen. +Cette installation est livrée avec différentes extensions: + +* [MusicBox-Webclient](https://mopidy.com/ext/musicbox-webclient/) pour contrôler mopidy depuis votre navigateur Web +* [local](https://mopidy.com/ext/local/) pour rendre votre collection de musique privée sur `/home/yunohost.multimedia/share/Music/` consultable +* [YouTube](https://pypi.org/project/Mopidy-YouTube/) pour lire le son de YouTube +* [YTMusic](https://music.youtube.com/) pour accéder à la musique en streaming de Google intitulée [YouTube Music](https://music.youtube.com/) +* [Podcast-iTunes](https://mopidy.com/ext/podcast-itunes/) pour rechercher et parcourir des podcasts sur l'iTunes Store d'Apple +* [RadioNet](https://mopidy.com/ext/radionet/) pour écouter les canaux radio de [radio.net](https://www.radio.net/) +* [Podcast](https://mopidy.com/ext/podcast/) pour parcourir les flux RSS des podcasts et diffuser les épisodes +* [Soundcloud](https://pypi.org/project/Mopidy-SoundCloud/) pour lire de la musique à partir du service [SoundCloud](https://soundcloud.com/) service \([jeton d'authentification](https://pypi.org/project/Mopidy-SoundCloud/) nécessaire\). + ## Documentation - * Documentation officielle : Lien vers la documentation officielle de cette application. - * Documentation YunoHost : Si une documentation spécifique est nécessaire, n'hésitez pas à contribuer. - + * Documentation officielle : https://docs.mopidy.com/en/latest/ ## Caractéristiques spécifiques YunoHost #### Support multi-utilisateur -* L'authentification LDAP et HTTP est-elle prise en charge ? +* L'authentification LDAP et HTTP est-elle prise en charge ? Non * L'application peut-elle être utilisée par plusieurs utilisateurs ? #### Architectures supportées @@ -48,6 +58,12 @@ Comment configurer cette application : via le panneau d'administration, un fichi ## Informations additionnelles + +To list current settings enter `sudo mopidyctl config` \ +Edit the file `/opt/yunohost/mopidy/mopidy.conf` to adjust mopidy's configuration.\\ + +To rebuild the database of your local music collection enter `sudo mopidyctl local scan` + * Autres informations que vous souhaitez ajouter sur cette application. **Plus d'informations sur la page de documentation :** From 29ac4925be7d407b932726476e17293fac810b5f Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Wed, 17 Mar 2021 20:47:04 +0100 Subject: [PATCH 08/74] Update README_fr.md --- README_fr.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/README_fr.md b/README_fr.md index d147cad..5b74306 100644 --- a/README_fr.md +++ b/README_fr.md @@ -58,13 +58,9 @@ Cette installation est livrée avec différentes extensions: ## Informations additionnelles - -To list current settings enter `sudo mopidyctl config` \ -Edit the file `/opt/yunohost/mopidy/mopidy.conf` to adjust mopidy's configuration.\\ - -To rebuild the database of your local music collection enter `sudo mopidyctl local scan` - -* Autres informations que vous souhaitez ajouter sur cette application. +* Pour lister les paramètres actuels, entrez `sudo mopidyctl config` +* Modifiez le fichier /opt/yunohost/mopidy/mopidy.conf pour ajuster la configuration de mopidy +* Pour reconstruire la base de données de votre collection de musique locale, entrez `sudo mopidyctl local scan` **Plus d'informations sur la page de documentation :** https://yunohost.org/packaging_apps From 421e69d8cc4f2f909323e32b11974a2a49f4ac96 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Wed, 17 Mar 2021 21:23:56 +0100 Subject: [PATCH 09/74] initial version --- README_fr.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/README_fr.md b/README_fr.md index 5b74306..e1f1d34 100644 --- a/README_fr.md +++ b/README_fr.md @@ -21,7 +21,7 @@ Vous pouvez modifier la liste de lecture à partir d'un téléphone, d'une table ## Démo -* [Démo officielle](Lien vers un site de démonstration de cette application.) +* Aucune démo disponible ## Configuration @@ -67,9 +67,8 @@ https://yunohost.org/packaging_apps ## Liens - * Signaler un bug : https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/issues - * Site de l'application : Lien vers le site officiel de cette application. - * Dépôt de l'application principale : Lien vers le dépôt officiel de l'application principale. + * Signaler un bug : https://github.com/YunoHost-Apps/mopidy_ynh/issues + * Site de l'application : https://mopidy.com/ * Site web YunoHost : https://yunohost.org/ --- @@ -77,11 +76,11 @@ https://yunohost.org/packaging_apps ## Informations pour les développeurs **Seulement si vous voulez utiliser une branche de test pour le codage, au lieu de fusionner directement dans la banche principale.** -Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/tree/testing). +Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/mopidy_ynh/tree/testing). Pour essayer la branche testing, procédez comme suit. ``` -sudo yunohost app install https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/tree/testing --debug +sudo yunohost app install https://github.com/YunoHost-Apps/mopidy_ynh/tree/testing --debug ou -sudo yunohost app upgrade REPLACEBYYOURAPP -u https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/tree/testing --debug +sudo yunohost app upgrade REPLACEBYYOURAPP -u https://github.com/YunoHost-Apps/mopidy_ynh/tree/testing --debug ``` From c25eb338cde62d39022a898b0c01946427679e55 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Wed, 17 Mar 2021 21:32:37 +0100 Subject: [PATCH 10/74] improve layout --- README.md | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 6c6f73a..5b69705 100644 --- a/README.md +++ b/README.md @@ -26,17 +26,12 @@ It plays music, podcasts and radio programs from local disk and various streamin This installation is shipped with various extensions: * [MusicBox-Webclient](https://mopidy.com/ext/musicbox-webclient/) to control mopidy from your web browser - * [local](https://mopidy.com/ext/local/) to make your private music collection on `/home/yunohost.multimedia/share/Music/` browseable and searchable - * [YouTube](https://pypi.org/project/Mopidy-YouTube/) to play sound from YouTube - * [YTMusic](https://music.youtube.com/) to access Google’s streaming music named [YouTube Music](https://music.youtube.com/) * [Podcast-iTunes](https://mopidy.com/ext/podcast-itunes/) to search and browse podcasts from the Apple iTunes Store. * [RadioNet](https://mopidy.com/ext/radionet/) to play radio channels from the [radio.net](https://www.radio.net/). - * [Podcast](https://mopidy.com/ext/podcast/) to browse RSS feeds of podcasts and stream the episodes. - * [Soundcloud](https://pypi.org/project/Mopidy-SoundCloud/) to play music from the [SoundCloud](https://soundcloud.com/) service \([authentication token](https://pypi.org/project/Mopidy-SoundCloud/) needed\). ## Documentation @@ -61,10 +56,9 @@ Can the app be used by multiple users? ?? ## Additional information -To list current settings enter `sudo mopidyctl config` \ -Edit the file `/opt/yunohost/mopidy/mopidy.conf` to adjust mopidy's configuration.\\ - -To rebuild the database of your local music collection enter `sudo mopidyctl local scan` +* To list current settings enter `sudo mopidyctl config`. +* Edit the file `/opt/yunohost/mopidy/mopidy.conf` to adjust mopidy's configuration. +* To rebuild the database of your local music collection enter `sudo mopidyctl local scan`. **More info on the documentation page:** https://yunohost.org/packaging_apps @@ -80,11 +74,11 @@ https://yunohost.org/packaging_apps ## Developer info **Only if you want to use a testing branch for coding, instead of merging directly into master.** -Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/tree/testing). +Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/mopidy_ynh/tree/testing). To try the testing branch, please proceed like that. ``` -sudo yunohost app install https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/tree/testing --debug +sudo yunohost app install https://github.com/YunoHost-Apps/mopidy_ynh/tree/testing --debug or -sudo yunohost app upgrade REPLACEBYYOURAPP -u https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/tree/testing --debug +sudo yunohost app upgrade REPLACEBYYOURAPP -u https://github.com/YunoHost-Apps/mopidy_ynh/tree/testing --debug ``` From 9cf5f2a2a2eb207fb694d020ea1e8e8c51cd61e8 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 01:15:19 +0100 Subject: [PATCH 11/74] initial version --- LICENSE | 204 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 201 insertions(+), 3 deletions(-) diff --git a/LICENSE b/LICENSE index f3cff84..d645695 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,202 @@ -File containing the license of your package. -More information here: -https://github.com/YunoHost/doc/blob/master/packaging_apps_guidelines_fr.md#yep-13---indiquer-la-licence-associ%C3%A9e-au-paquet---brouillon--auto--working- + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. From 20279325a80f1df2d03becd28ad5a45166e40925 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 02:04:29 +0100 Subject: [PATCH 12/74] 2>&1 --- scripts/_common.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 246aead..1cc7992 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -82,7 +82,7 @@ myynh_install() { # Install or update the main directory yunohost.multimedia # see https://github.com/YunoHost-Apps/yunohost.multimedia ynh_multimedia_build_main_dir () { - wget -nv https://github.com/maniackcrudelis/yunohost.multimedia/archive/master.zip + wget -nv https://github.com/maniackcrudelis/yunohost.multimedia/archive/master.zip 2>&1 unzip master.zip sudo ./yunohost.multimedia-master/script/ynh_media_build.sh } From f778e3e0b9e45b5f0f021f07f46eb2216e553e75 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 16:31:42 +0100 Subject: [PATCH 13/74] set license and maintainer --- manifest.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 2216942..ff8c6f9 100644 --- a/manifest.json +++ b/manifest.json @@ -8,8 +8,12 @@ }, "version": "1.0.2", "url": "https://www.mopidy.com/", - "license": "free", + "license": "Apache-2.0", "maintainer": { + "name": "siwinter", + "email": "siegfried.winter@arcor.de" + }, + "previous_maintainer": { "name": "cyp", "email": "cyp@rouquin.me" }, From d9a8d5c4ce321a6936aa0355eccb4efaa9105023 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 17:15:47 +0100 Subject: [PATCH 14/74] initial version --- issue_template.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/issue_template.md b/issue_template.md index 4a290c4..758e822 100644 --- a/issue_template.md +++ b/issue_template.md @@ -8,7 +8,7 @@ about: When creating a bug report, please use the following template to provide 1. *Read this whole template first.* 2. *Determine if you are on the right place:* - *If you were performing an action on the app from the webadmin or the CLI (install, update, backup, restore, change_url...), you are on the right place!* - - *Otherwise, the issue may be due to REPLACEBYYOURAPP itself. Refer to its documentation or repository for help.* + - *Otherwise, the issue may be due to mopidy itself. Refer to its documentation or repository for help.* - *When in doubt, post here and we will figure it out together.* 3. *Delete the italic comments as you write over them below, and remove this guide.* --- @@ -31,7 +31,7 @@ about: When creating a bug report, please use the following template to provide - *If you performed a command from the CLI, the command itself is enough. For example:* ```sh - sudo yunohost app install REPLACEBYYOURAPP + sudo yunohost app install mopidy ``` - *If you used the webadmin, please perform the equivalent command from the CLI first.* - *If the error occurs in your browser, explain what you did:* From f7232c1d8ff65137cc36beb31f46cd7def12640f Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 17:22:36 +0100 Subject: [PATCH 15/74] replace /path by /path/ --- conf/nginx.conf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 0d33d43..2cabe2d 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,4 +1,4 @@ -location /mopidy/ws { +location /mopidy/ws/ { # Force usage of https if ($scheme = http) { @@ -15,7 +15,7 @@ location /mopidy/ws { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } -location __PATH__ { +location __PATH__/ { # Force usage of https if ($scheme = http) { @@ -30,7 +30,7 @@ location __PATH__ { include conf.d/yunohost_panel.conf.inc; } -location /musicbox_webclient { +location /musicbox_webclient/ { # Force usage of https if ($scheme = http) { @@ -45,7 +45,7 @@ location /musicbox_webclient { include conf.d/yunohost_panel.conf.inc; } -location /local { +location /local/ { # Force usage of https if ($scheme = http) { From 68213a5c1ad07de4f780f881bfa9834b269559e3 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 17:28:31 +0100 Subject: [PATCH 16/74] Rename check_process.default to check_process --- check_process.default => check_process | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename check_process.default => check_process (100%) diff --git a/check_process.default b/check_process similarity index 100% rename from check_process.default rename to check_process From 903cd6c8d6d72ba38172ab4a0474c52ac479f7ca Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 17:38:45 +0100 Subject: [PATCH 17/74] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f3a1c8d..3f92cb3 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Mopidy for YunoHost -[![Integration level](https://dash.yunohost.org/integration/REPLACEBYYOURAPP.svg)](https://dash.yunohost.org/appci/app/REPLACEBYYOURAPP) ![](https://ci-apps.yunohost.org/ci/badges/REPLACEBYYOURAPP.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/REPLACEBYYOURAPP.maintain.svg) -[![Install REPLACEBYYOURAPP with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=REPLACEBYYOURAPP) +[![Integration level](https://dash.yunohost.org/integration/REPLACEBYYOURAPP.svg)](https://dash.yunohost.org/appci/app/REPLACEBYYOURAPP) ![](https://ci-apps.yunohost.org/ci/badges/mopidy.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/mopidy.maintain.svg) +[![Install mopidy with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=mopidy) *[Lire ce readme en français.](./README_fr.md)* From cc1bcdd94b7378a7f20fbcf487f050a0d1442d51 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 17:40:18 +0100 Subject: [PATCH 18/74] Update README_fr.md --- README_fr.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README_fr.md b/README_fr.md index e1f1d34..cedf7a5 100644 --- a/README_fr.md +++ b/README_fr.md @@ -1,7 +1,7 @@ # Mopidy pour YunoHost -[![Niveau d'intégration](https://dash.yunohost.org/integration/REPLACEBYYOURAPP.svg)](https://dash.yunohost.org/appci/app/REPLACEBYYOURAPP) ![](https://ci-apps.yunohost.org/ci/badges/REPLACEBYYOURAPP.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/REPLACEBYYOURAPP.maintain.svg) -[![Installer REPLACEBYYOURAPP avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=REPLACEBYYOURAPP) +[![Niveau d'intégration](https://dash.yunohost.org/integration/mopidy.svg)](https://dash.yunohost.org/appci/app/mopidy) ![](https://ci-apps.yunohost.org/ci/badges/mopidy.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/mopidy.maintain.svg) +[![Installer mopidy avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=mopidy) *[Read this readme in english.](./README.md)* From 7b437eea118ba3a0e61eb9e837d40f4c4c924873 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 17:41:08 +0100 Subject: [PATCH 19/74] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3f92cb3..824b7cf 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Mopidy for YunoHost -[![Integration level](https://dash.yunohost.org/integration/REPLACEBYYOURAPP.svg)](https://dash.yunohost.org/appci/app/REPLACEBYYOURAPP) ![](https://ci-apps.yunohost.org/ci/badges/mopidy.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/mopidy.maintain.svg) +[![Integration level](https://dash.yunohost.org/integration/mopidy.svg)](https://dash.yunohost.org/appci/app/mopidy) ![](https://ci-apps.yunohost.org/ci/badges/mopidy.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/mopidy.maintain.svg) [![Install mopidy with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=mopidy) *[Lire ce readme en français.](./README_fr.md)* From cdad7a3a717e4b7cc66bb8cd1b43adb40f643d1d Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 17:45:36 +0100 Subject: [PATCH 20/74] replace placeholder --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 824b7cf..04cdc57 100644 --- a/README.md +++ b/README.md @@ -54,8 +54,8 @@ Can the app be used by multiple users? ?? #### Supported architectures -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/REPLACEBYYOURAPP%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/REPLACEBYYOURAPP/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/REPLACEBYYOURAPP%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/REPLACEBYYOURAPP/) +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/mopidy%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/mopidy/) +* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/mopidy%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/mopidy/) ## Limitations @@ -73,7 +73,7 @@ https://yunohost.org/packaging_apps ## Links - * Report a bug: https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/issues + * Report a bug: https://github.com/YunoHost-Apps/mopidy_ynh/issues * App website: https://mopidy.com/ * YunoHost website: https://yunohost.org/ @@ -82,11 +82,11 @@ https://yunohost.org/packaging_apps ## Developer info **Only if you want to use a testing branch for coding, instead of merging directly into master.** -Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/tree/testing). +Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/mopidy_ynh/tree/testing). To try the testing branch, please proceed like that. ``` -sudo yunohost app install https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/tree/testing --debug +sudo yunohost app install https://github.com/YunoHost-Apps/mopidy_ynh/tree/testing --debug or -sudo yunohost app upgrade REPLACEBYYOURAPP -u https://github.com/YunoHost-Apps/REPLACEBYYOURAPP_ynh/tree/testing --debug +sudo yunohost app upgrade mopidy -u https://github.com/YunoHost-Apps/mopidy_ynh/tree/testing --debug ``` From 1035fef37ef0f3b2a6b1fbbba0c316a8dcd5ab45 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 17:48:50 +0100 Subject: [PATCH 21/74] replace placeholder --- README_fr.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README_fr.md b/README_fr.md index cedf7a5..0146670 100644 --- a/README_fr.md +++ b/README_fr.md @@ -49,8 +49,8 @@ Cette installation est livrée avec différentes extensions: #### Architectures supportées -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/REPLACEBYYOURAPP%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/REPLACEBYYOURAPP/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/REPLACEBYYOURAPP%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/REPLACEBYYOURAPP/) +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/mopidy%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/mopidy/) +* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/mopidy%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/mopidy/) ## Limitations @@ -82,5 +82,5 @@ Pour essayer la branche testing, procédez comme suit. ``` sudo yunohost app install https://github.com/YunoHost-Apps/mopidy_ynh/tree/testing --debug ou -sudo yunohost app upgrade REPLACEBYYOURAPP -u https://github.com/YunoHost-Apps/mopidy_ynh/tree/testing --debug +sudo yunohost app upgrade mopidy -u https://github.com/YunoHost-Apps/mopidy_ynh/tree/testing --debug ``` From df50d8232750fb4d2162f9dd710c32fca0a850b9 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 17:59:21 +0100 Subject: [PATCH 22/74] progression bar settings --- scripts/remove | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/scripts/remove b/scripts/remove index 76c8ef9..e142348 100755 --- a/scripts/remove +++ b/scripts/remove @@ -12,7 +12,7 @@ source /usr/share/yunohost/helpers #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." --time --weight=1 +ynh_script_progression --message="Loading installation settings..." --weight=4 app=$YNH_APP_INSTANCE_NAME @@ -31,14 +31,14 @@ cmd_file="/usr/local/bin/mopidyctl" # Remove the service from the list of services known by YunoHost (added from `yunohost service add`) if ynh_exec_warn_less yunohost service status $app >/dev/null then - ynh_script_progression --message="Removing $app service integration..." --time --weight=1 + ynh_script_progression --message="Removing $app service integration..." --weight=2 yunohost service remove $app fi #================================================= # STOP AND REMOVE SERVICE #================================================= -ynh_script_progression --message="Stopping and removing the systemd service..." --time --weight=1 +ynh_script_progression --message="Stopping and removing the systemd service..." --weight=4 # Remove the dedicated systemd config ynh_remove_systemd_config @@ -46,7 +46,7 @@ ynh_remove_systemd_config #================================================= # REMOVE DEPENDENCIES #================================================= -ynh_script_progression --message="Removing dependencies..." --time --weight=1 +ynh_script_progression --message="Removing dependencies..." --weight=42 # Remove metapackage and its dependencies ynh_remove_app_dependencies @@ -54,7 +54,7 @@ ynh_remove_app_dependencies #================================================= # REMOVE APP MAIN DIR #================================================= -ynh_script_progression --message="Removing app main directory..." --time --weight=1 +ynh_script_progression --message="Removing app main directory..." --weight=2 # Remove the app directory securely ynh_secure_remove --file="$final_path" @@ -62,7 +62,7 @@ ynh_secure_remove --file="$final_path" #================================================= # REMOVE NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Removing NGINX web server configuration..." --time --weight=1 +ynh_script_progression --message="Removing NGINX web server configuration..." --weight=2 # Remove the dedicated NGINX config ynh_remove_nginx_config @@ -80,7 +80,7 @@ ynh_secure_remove --file="$cmd_file" #================================================= # REMOVE DEDICATED USER #================================================= -ynh_script_progression --message="Removing the dedicated system user..." --time --weight=1 +ynh_script_progression --message="Removing the dedicated system user..." --weight=2 # Delete a system user ynh_system_user_delete --username=$app From c7e0407da19cfd157c678119e9b214dbb8ca4525 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 18:19:34 +0100 Subject: [PATCH 23/74] Update remove --- scripts/remove | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/remove b/scripts/remove index e142348..68e9bb7 100755 --- a/scripts/remove +++ b/scripts/remove @@ -89,4 +89,4 @@ ynh_system_user_delete --username=$app # END OF SCRIPT #================================================= -ynh_script_progression --message="Removal of $app completed" --time --last +ynh_script_progression --message="Removal of $app completed" --last From 02977a75fd1295b3f3749bd6a697f41ba0d4d152 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 18:22:14 +0100 Subject: [PATCH 24/74] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 9b6ec89..37a9504 100755 --- a/scripts/install +++ b/scripts/install @@ -192,7 +192,7 @@ ynh_permission_url --permission="main" --add_url="$domain/musicbox_webclient" #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." --time --weight=1 +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 ynh_systemd_action --service_name=nginx --action=reload From 1ccd5ba821723c1da22b8664a584df455013bc4a Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 19:14:37 +0100 Subject: [PATCH 25/74] set progression bar --- scripts/install | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/scripts/install b/scripts/install index 37a9504..eedca0c 100755 --- a/scripts/install +++ b/scripts/install @@ -36,7 +36,7 @@ cmd_file="/usr/local/bin/mopidyctl" #================================================= # CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS #================================================= -ynh_script_progression --message="Validating installation parameters..." --time --weight=1 +ynh_script_progression --message="Validating installation parameters..." test ! -e "$final_path" || ynh_die --message="This path already contains a folder" @@ -56,7 +56,7 @@ ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url #================================================= # STORE SETTINGS FROM MANIFEST #================================================= -ynh_script_progression --message="Storing installation settings..." --time --weight=1 +ynh_script_progression --message="Storing installation settings..." ynh_app_setting_set --app=$app --key=domain --value=$domain ynh_app_setting_set --app=$app --key=path --value=$path_url @@ -66,7 +66,7 @@ ynh_app_setting_set --app=$app --key=path --value=$path_url #================================================= # FIND AND OPEN A PORT #================================================= -ynh_script_progression --message="Finding an available port..." --time --weight=1 +ynh_script_progression --message="Finding an available port..." # Find an available port port=$(ynh_find_port --port=6680) @@ -75,14 +75,14 @@ ynh_app_setting_set --app=$app --key=port --value=$port #================================================= # INSTALL DEPENDENCIES #================================================= -ynh_script_progression --message="Installing dependencies..." --time --weight=1 +ynh_script_progression --message="Installing dependencies..." --weight=40 ynh_install_app_dependencies $pkg_dependencies #================================================= # CREATE DEDICATED USER #================================================= -ynh_script_progression --message="Configuring system user..." --time --weight=1 +ynh_script_progression --message="Configuring system user..." # Create a system user ynh_system_user_create --username="$app" --home_dir="$final_path" --use_shell @@ -90,7 +90,7 @@ ynh_system_user_create --username="$app" --home_dir="$final_path" --use_shell #================================================= # INSTALL MOPIDY IN PYTHON ENVIRONMENT #================================================= -ynh_script_progression --message="Setting up source files..." --time --weight=1 +ynh_script_progression --message="Install in Python environment..." myynh_install @@ -99,7 +99,7 @@ ynh_app_setting_set --app=$app --key=final_path --value=$final_path #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Configuring NGINX web server..." --time --weight=1 +ynh_script_progression --message="Configuring NGINX web server..." # Create a dedicated NGINX config ynh_add_nginx_config @@ -111,7 +111,7 @@ ynh_add_nginx_config #================================================= # CREATE YUNOHOST DIRECTORIES #================================================= -ynh_script_progression --message="Creating yunohost directories..." --time --weight=1 +ynh_script_progression --message="Creating yunohost directories..." ynh_multimedia_build_main_dir # /home/yunohost.multimedia @@ -122,7 +122,7 @@ chown -R $app: "$work_dir" #================================================= # SETUP SYSTEMD #================================================= -ynh_script_progression --message="Configuring a systemd service..." --time --weight=1 +ynh_script_progression --message="Configuring a systemd service..." # Create a dedicated systemd config start_file="$final_path/env/bin/$app" @@ -131,7 +131,7 @@ ynh_add_systemd_config --others_var="conf_file start_file" # substitute __CO #================================================= # MODIFY A CONFIG FILE #================================================= -ynh_script_progression --message="Setup config file..." --time --weight=1 +ynh_script_progression --message="Setup config file..." cp ../conf/app.conf "$conf_file" if [ -n "$(uname -m | grep arm)" ]; # check CPU (raspberry is armxx) @@ -163,14 +163,14 @@ chown $app: $final_path #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= -ynh_script_progression --message="Integrating service in YunoHost..." --time --weight=1 +ynh_script_progression --message="Integrating service in YunoHost..." yunohost service add $app --log_type systemd --description "this is mopidy, a music server" #================================================= # START SYSTEMD SERVICE #================================================= -ynh_script_progression --message="Starting a systemd service..." --time --weight=1 +ynh_script_progression --message="Starting a systemd service..." # Start a systemd service ynh_systemd_action --service_name=$app --action="start" @@ -178,7 +178,7 @@ ynh_systemd_action --service_name=$app --action="start" #================================================= # SETUP SSOWAT #================================================= -ynh_script_progression --message="Configuring permissions..." --time --weight=1 +ynh_script_progression --message="Configuring permissions..." # Make app public if necessary if [ $is_public -eq 1 ]; then @@ -192,14 +192,14 @@ ynh_permission_url --permission="main" --add_url="$domain/musicbox_webclient" #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." --weight=1 +ynh_script_progression --message="Reloading NGINX web server..." ynh_systemd_action --service_name=nginx --action=reload #================================================= # PROVIDE ADDITIONAL SHELL COMAND #================================================= -ynh_script_progression --message="Provide additional shell comand..." --time --weight=1 +ynh_script_progression --message="Provide additional shell comand..." cp -a ../sources/extra_files/mopidyctl "$cmd_file" ynh_replace_string --match_string="__APP__" --replace_string=$app --target_file="$cmd_file" @@ -228,7 +228,7 @@ fi #================================================= # SCAN LOCAL MEDIA DIRECTORY #================================================= -ynh_script_progression --message="Scan local media directory..." --weight=1 +ynh_script_progression --message="Scan local media directory..." "$cmd_file" local scan @@ -236,4 +236,4 @@ ynh_script_progression --message="Scan local media directory..." --weight=1 # END OF SCRIPT #================================================= -ynh_script_progression --message="Installation of $app completed" --time --last +ynh_script_progression --message="Installation of $app completed"--last From 674a5343ccb68ab5a7d703d2f717bd3946fb86e0 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 19:22:55 +0100 Subject: [PATCH 26/74] set progression bar --- scripts/_common.sh | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 1cc7992..831eb21 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -16,7 +16,7 @@ pkg_dependencies="build-essential python3-dev python3-pip python3-venv git postg python_version="$(python3 -V | cut -d' ' -f2 | cut -d. -f1-2)" myynh_install() { - ynh_script_progression --message="Install / upgrade mopidy via pip..." --time --weight=1 + ynh_script_progression --message="Install / upgrade mopidy via pip..." --weight=8 python3 -m venv "${final_path}/env" chown -R "$app" "$final_path" @@ -27,7 +27,7 @@ myynh_install() { set -o nounset ynh_exec_as $app $final_path/env/bin/pip install --upgrade --no-cache-dir pip - ynh_script_progression --message="Installing essentials..." --time --weight=1 + ynh_script_progression --message="Installing essentials..." --weight=17 # to make Gstreamer visible in Python environment $final_path/env/bin/python3 -m pip install vext @@ -39,26 +39,26 @@ myynh_install() { ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-local==3.2.1 ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-MusicBox-Webclient==3.1.0 - ynh_script_progression --message="Installing Mopidy-YouTube..." --time --weight=1 + ynh_script_progression --message="Installing Mopidy-YouTube..." --weight=7 ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-YouTube==3.2 - ynh_script_progression --message="Installing Mopidy-YTMusic..." --time --weight=1 + ynh_script_progression --message="Installing Mopidy-YTMusic..." --weight=2 ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-YTMusic==0.2.2 - ynh_script_progression --message="Installing Mopidy-RadioNet..." --time --weight=1 + ynh_script_progression --message="Installing Mopidy-RadioNet..." ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-RadioNet==0.2.2 - ynh_script_progression --message="Installing Mopidy-Podcast..." --time --weight=1 + ynh_script_progression --message="Installing Mopidy-Podcast..." ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-Podcast==3.0.0 - ynh_script_progression --message="Installing Mopidy-Podcast-iTunes..." --time --weight=1 + ynh_script_progression --message="Installing Mopidy-Podcast-iTunes..." --weight=2 ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-Podcast-iTunes==3.0.0 - ynh_script_progression --message="Installing Mopidy-SoundCloud..." --time --time --weight=1 + ynh_script_progression --message="Installing Mopidy-SoundCloud..." --weight=6 ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-SoundCloud # ynh_script_progression --message="Installing Mopidy-Spotify..." --time --weight=1 # ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-Spotify Spotify Lib currently not available!! - if [ -n "$(uname -m | grep arm)" ]; # check CPU (raspberry is armxx) - then - ynh_script_progression --message="Installing Mopidy-Raspberry-GPIO..." --time --weight=1 - ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-Raspberry-GPIO - fi +# if [ -n "$(uname -m | grep arm)" ]; # check CPU (raspberry is armxx) +# then +# ynh_script_progression --message="Installing Mopidy-Raspberry-GPIO..." --time --weight=1# +# ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-Raspberry-GPIO +# fi # set +o nounset From bce7908698290410c62a9dd9c4a813d6a590b487 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 20:38:51 +0100 Subject: [PATCH 27/74] Update nginx.conf --- conf/nginx.conf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index 2cabe2d..f2ba50c 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,4 +1,4 @@ -location /mopidy/ws/ { +location /mopidy/ws { # Force usage of https if ($scheme = http) { @@ -22,7 +22,7 @@ location __PATH__/ { rewrite ^ https://$server_name$request_uri? permanent; } - proxy_pass http://localhost:__PORT__/musicbox_webclient; + proxy_pass http://localhost:__PORT__/musicbox_webclient/; proxy_http_version 1.1; proxy_set_header Host $host; @@ -37,7 +37,7 @@ location /musicbox_webclient/ { rewrite ^ https://$server_name$request_uri? permanent; } - proxy_pass http://localhost:6680/musicbox_webclient; + proxy_pass http://localhost:6680; proxy_http_version 1.1; proxy_set_header Host $host; @@ -52,7 +52,7 @@ location /local/ { rewrite ^ https://$server_name$request_uri? permanent; } - proxy_pass http://localhost:6680/local; + proxy_pass http://localhost:6680; proxy_http_version 1.1; proxy_set_header Host $host; From b831ad8aa256da6e35db0f34f148c1658835ab5d Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 20:41:54 +0100 Subject: [PATCH 28/74] improve progression bar --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 4102f9b..5cd40ea 100755 --- a/scripts/install +++ b/scripts/install @@ -65,7 +65,7 @@ ynh_app_setting_set --app=$app --key=port --value=$port #================================================= # INSTALL DEPENDENCIES #================================================= -ynh_script_progression --message="Installing dependencies..." --weight=40 +ynh_script_progression --message="Installing dependencies..." --weight=20 ynh_install_app_dependencies $pkg_dependencies From 5a3d979e72bd05eba936e7979294359b20e05a4d Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 21:17:26 +0100 Subject: [PATCH 29/74] simplify manifest --- manifest.json | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/manifest.json b/manifest.json index ff8c6f9..559ca36 100644 --- a/manifest.json +++ b/manifest.json @@ -3,10 +3,9 @@ "id": "mopidy", "packaging_format": 1, "description": { - "en": "Mopidy - is an extensible music server written in Python.", - "fr": "Mopidy - est un serveur de musique extensible écrit en Python" + "en": "An extensible music server to play audio from your music collection and various streaming services" }, - "version": "1.0.2", + "version": "3.1.1-ynh1", "url": "https://www.mopidy.com/", "license": "Apache-2.0", "maintainer": { @@ -29,29 +28,17 @@ { "name": "domain", "type": "domain", - "ask": { - "en": "Choose a domain name for Mopidy", - "fr": "Choisissez un nom de domaine pour Mopidy" - }, "example": "example.org" }, { "name": "path", "type": "path", - "ask": { - "en": "Choose a path for Mopidy", - "fr": "Choisissez un chemin pour Mopidy" - }, "example": "/mopidy", "default": "/mopidy" }, { "name": "is_public", "type": "boolean", - "ask": { - "en": "Is it a public application?", - "fr": "Est-ce une application publique ?" - }, "default": true } ] From 40ff7da6a0474b8d3758f9f115d41cc7b603a14f Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 21:27:21 +0100 Subject: [PATCH 30/74] Update manifest.json --- manifest.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index ff8c6f9..c47ae58 100644 --- a/manifest.json +++ b/manifest.json @@ -3,8 +3,7 @@ "id": "mopidy", "packaging_format": 1, "description": { - "en": "Mopidy - is an extensible music server written in Python.", - "fr": "Mopidy - est un serveur de musique extensible écrit en Python" + "en": "Mopidy - is an extensible music server written in Python." }, "version": "1.0.2", "url": "https://www.mopidy.com/", From ea09fef425517d13d52dc2752f093a205562cff8 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 21:29:59 +0100 Subject: [PATCH 31/74] Update manifest.json --- manifest.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/manifest.json b/manifest.json index c47ae58..18a4bfa 100644 --- a/manifest.json +++ b/manifest.json @@ -28,10 +28,6 @@ { "name": "domain", "type": "domain", - "ask": { - "en": "Choose a domain name for Mopidy", - "fr": "Choisissez un nom de domaine pour Mopidy" - }, "example": "example.org" }, { From d316a40be4de8bf6af45fcae3b12f3587521b3b0 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 21:35:34 +0100 Subject: [PATCH 32/74] Update manifest.json --- manifest.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/manifest.json b/manifest.json index 18a4bfa..046e3c2 100644 --- a/manifest.json +++ b/manifest.json @@ -33,10 +33,6 @@ { "name": "path", "type": "path", - "ask": { - "en": "Choose a path for Mopidy", - "fr": "Choisissez un chemin pour Mopidy" - }, "example": "/mopidy", "default": "/mopidy" }, From d4d76cd3b06b2fd6e04f1b9323137adb00793b2e Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 21:43:23 +0100 Subject: [PATCH 33/74] Update manifest.json --- manifest.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/manifest.json b/manifest.json index 046e3c2..0fb32a6 100644 --- a/manifest.json +++ b/manifest.json @@ -39,10 +39,7 @@ { "name": "is_public", "type": "boolean", - "ask": { - "en": "Is it a public application?", - "fr": "Est-ce une application publique ?" - }, + "help": "en: public app can be used by anonymous visitors", "default": true } ] From 58aa835463fb012282d8aad1709c11ef46f2a11b Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 22:11:11 +0100 Subject: [PATCH 34/74] Update manifest.json --- manifest.json | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index 559ca36..ff8c6f9 100644 --- a/manifest.json +++ b/manifest.json @@ -3,9 +3,10 @@ "id": "mopidy", "packaging_format": 1, "description": { - "en": "An extensible music server to play audio from your music collection and various streaming services" + "en": "Mopidy - is an extensible music server written in Python.", + "fr": "Mopidy - est un serveur de musique extensible écrit en Python" }, - "version": "3.1.1-ynh1", + "version": "1.0.2", "url": "https://www.mopidy.com/", "license": "Apache-2.0", "maintainer": { @@ -28,17 +29,29 @@ { "name": "domain", "type": "domain", + "ask": { + "en": "Choose a domain name for Mopidy", + "fr": "Choisissez un nom de domaine pour Mopidy" + }, "example": "example.org" }, { "name": "path", "type": "path", + "ask": { + "en": "Choose a path for Mopidy", + "fr": "Choisissez un chemin pour Mopidy" + }, "example": "/mopidy", "default": "/mopidy" }, { "name": "is_public", "type": "boolean", + "ask": { + "en": "Is it a public application?", + "fr": "Est-ce une application publique ?" + }, "default": true } ] From 016d051833b5ff6403d4a6c745e199f73b25b81e Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 22:36:56 +0100 Subject: [PATCH 35/74] Update manifest.json --- manifest.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/manifest.json b/manifest.json index ff8c6f9..b6df8ac 100644 --- a/manifest.json +++ b/manifest.json @@ -3,10 +3,9 @@ "id": "mopidy", "packaging_format": 1, "description": { - "en": "Mopidy - is an extensible music server written in Python.", - "fr": "Mopidy - est un serveur de musique extensible écrit en Python" + "en": "An extensible music server to play music, podcasts and radio programs from local disk and various streaming services" }, - "version": "1.0.2", + "version": "3.1.1-ynh1", "url": "https://www.mopidy.com/", "license": "Apache-2.0", "maintainer": { @@ -52,7 +51,7 @@ "en": "Is it a public application?", "fr": "Est-ce une application publique ?" }, - "default": true + "default": false } ] } From 0b47210417dcbb059390adb149d1b107b96d527e Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 22:47:55 +0100 Subject: [PATCH 36/74] Update manifest.json --- manifest.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/manifest.json b/manifest.json index b6df8ac..e44f0a4 100644 --- a/manifest.json +++ b/manifest.json @@ -28,10 +28,6 @@ { "name": "domain", "type": "domain", - "ask": { - "en": "Choose a domain name for Mopidy", - "fr": "Choisissez un nom de domaine pour Mopidy" - }, "example": "example.org" }, { From 6940c1ff1a8b0f5d51db835611f22712bdb9a6d9 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Fri, 19 Mar 2021 23:06:47 +0100 Subject: [PATCH 37/74] Update manifest.json --- manifest.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/manifest.json b/manifest.json index e44f0a4..0300749 100644 --- a/manifest.json +++ b/manifest.json @@ -28,6 +28,10 @@ { "name": "domain", "type": "domain", + "ask": { + "en": "Choose a domain for Mopidy", + "fr": "Choisissez un domaine pour Mopidy" + }, "example": "example.org" }, { From c052517d3fbb30d439a671727158856c463a71b4 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 21 Mar 2021 13:04:08 +0100 Subject: [PATCH 38/74] Update manifest.json --- manifest.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest.json b/manifest.json index 4a1352f..e4e1816 100644 --- a/manifest.json +++ b/manifest.json @@ -28,15 +28,17 @@ { "name": "domain", "type": "domain", - "ask": { - "en": "Choose a domain for Mopidy", - "fr": "Choisissez un domaine pour Mopidy" - }, + "ask": { + "en": "Choose a domain for Mopidy" + }, "example": "example.org" }, { "name": "path", "type": "path", + "ask": { + "en": "Choose a path for Mopidy" + }, "example": "/mopidy", "default": "/mopidy" }, @@ -46,9 +48,7 @@ "help": "en: public app can be used by anonymous visitors", "default": true "ask": { - "en": "Is it a public application?", - "fr": "Est-ce une application publique ?" - }, + "en": "Is it a public application?" }, "default": false } ] From e4dedec0c03c7d841c8f6d6ea38c4bc8fdcbda8b Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 21 Mar 2021 13:06:12 +0100 Subject: [PATCH 39/74] Update manifest.json --- manifest.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index e4e1816..a140543 100644 --- a/manifest.json +++ b/manifest.json @@ -45,10 +45,10 @@ { "name": "is_public", "type": "boolean", - "help": "en: public app can be used by anonymous visitors", - "default": true "ask": { - "en": "Is it a public application?" }, + "en": "Is it a public application?" + }, + "help": "en: public app can be used by anonymous visitors", }, "default": false } ] From 9029677354c0d286f4f973a68d5642cad1100c8a Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 21 Mar 2021 13:12:20 +0100 Subject: [PATCH 40/74] Update manifest.json --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index a140543..6d85c27 100644 --- a/manifest.json +++ b/manifest.json @@ -48,7 +48,7 @@ "ask": { "en": "Is it a public application?" }, - "help": "en: public app can be used by anonymous visitors", }, + "help": "en: public app can be used by anonymous visitors", "default": false } ] From 2e7c7fc7f77c1197cbbc2e1f27829affe9b45362 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 21 Mar 2021 13:36:30 +0100 Subject: [PATCH 41/74] Update manifest.json --- manifest.json | 106 +++++++++++++++++++++++++------------------------- 1 file changed, 52 insertions(+), 54 deletions(-) diff --git a/manifest.json b/manifest.json index 6d85c27..f4c887f 100644 --- a/manifest.json +++ b/manifest.json @@ -1,56 +1,54 @@ { - "name": "Mopidy", - "id": "mopidy", - "packaging_format": 1, - "description": { - "en": "An extensible music server to play music, podcasts and radio programs from local disk and various streaming services" - }, - "version": "3.1.1-ynh1", - "url": "https://www.mopidy.com/", - "license": "Apache-2.0", - "maintainer": { - "name": "siwinter", - "email": "siegfried.winter@arcor.de" - }, - "previous_maintainer": { - "name": "cyp", - "email": "cyp@rouquin.me" - }, - "requirements": { - "yunohost": ">= 4.0.8" - }, - "multi_instance": false, - "services": [ - "nginx" - ], - "arguments": { - "install" : [ - { - "name": "domain", - "type": "domain", - "ask": { - "en": "Choose a domain for Mopidy" - }, - "example": "example.org" - }, - { - "name": "path", - "type": "path", - "ask": { - "en": "Choose a path for Mopidy" - }, - "example": "/mopidy", - "default": "/mopidy" - }, - { - "name": "is_public", - "type": "boolean", - "ask": { - "en": "Is it a public application?" - }, - "help": "en: public app can be used by anonymous visitors", - "default": false - } - ] - } + "name": "music", + "id": "musicbox", + "packaging_format": 1, + "description": { + "en": "webclient to control mopidy music server" + }, + "version": "1.0~ynh1", + "url": "https://www.mopidy.com/", + "license": "free", + "maintainer": { + "name": "John doe", + "email": "john.doe@example.com", + "url": "http://example.com" + }, + "requirements": { + "yunohost": ">= 3.5" + }, + "multi_instance": false, + "services": [ + "nginx" + ], + "arguments": { + "install" : [ + { + "name": "domain", + "type": "domain", + "ask": { + "en": "Choose a domain name for musicbox" + }, + "example": "example.com" + }, + { + "name": "path", + "type": "path", + "ask": { + "en": "Choose a path for ynhexample", + "fr": "Choisissez un chemin pour ynhexample" + }, + "example": "/example", + "default": "/musicbox" + }, + { + "name": "is_public", + "type": "boolean", + "ask": { + "en": "Is it a public application?", + "fr": "Est-ce une application publique ?" + }, + "default": true + } + ] + } } From df37dfd2b8a48f2e1a8d84cc8e8e67b853ab61e0 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 21 Mar 2021 13:39:05 +0100 Subject: [PATCH 42/74] Update manifest.json --- manifest.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/manifest.json b/manifest.json index f4c887f..24cab30 100644 --- a/manifest.json +++ b/manifest.json @@ -1,10 +1,10 @@ { - "name": "music", - "id": "musicbox", - "packaging_format": 1, - "description": { - "en": "webclient to control mopidy music server" - }, + "name": "Mopidy", + "id": "mopidy", + "packaging_format": 1, + "description": { + "en": "An extensible music server to play music, podcasts and radio programs from local disk and various streaming services" + }, "version": "1.0~ynh1", "url": "https://www.mopidy.com/", "license": "free", From 3a2003b11c0832b2db40efdb12396313520a8336 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 21 Mar 2021 13:58:53 +0100 Subject: [PATCH 43/74] Update install --- scripts/install | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index 5cd40ea..cb83e32 100755 --- a/scripts/install +++ b/scripts/install @@ -65,9 +65,9 @@ ynh_app_setting_set --app=$app --key=port --value=$port #================================================= # INSTALL DEPENDENCIES #================================================= -ynh_script_progression --message="Installing dependencies..." --weight=20 +ynh_script_progression --message="Installing dependencies..." --weight=10 -ynh_install_app_dependencies $pkg_dependencies +#ynh_install_app_dependencies $pkg_dependencies siwi #================================================= # CREATE DEDICATED USER From 5f664157cba01708f325909067d872c0f1d889be Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 21 Mar 2021 14:02:02 +0100 Subject: [PATCH 44/74] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index cb83e32..83cb6a3 100755 --- a/scripts/install +++ b/scripts/install @@ -220,7 +220,7 @@ fi #================================================= ynh_script_progression --message="Scan local media directory..." -"$cmd_file" local scan +"$cmd_file" local scan 2>&1 #================================================= # END OF SCRIPT From 05bd9a79e8b08e562d2ca4dfc6b3b72a3c4a7d9d Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 21 Mar 2021 14:05:44 +0100 Subject: [PATCH 45/74] Update manifest.json --- manifest.json | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/manifest.json b/manifest.json index 24cab30..30e4389 100644 --- a/manifest.json +++ b/manifest.json @@ -5,17 +5,20 @@ "description": { "en": "An extensible music server to play music, podcasts and radio programs from local disk and various streaming services" }, - "version": "1.0~ynh1", - "url": "https://www.mopidy.com/", - "license": "free", - "maintainer": { - "name": "John doe", - "email": "john.doe@example.com", - "url": "http://example.com" - }, - "requirements": { - "yunohost": ">= 3.5" - }, + "version": "3.1.1-ynh2", + "url": "https://www.mopidy.com/", + "license": "Apache-2.0", + "maintainer": { + "name": "siwinter", + "email": "siegfried.winter@arcor.de" + }, + "previous_maintainer": { + "name": "cyp", + "email": "cyp@rouquin.me" + }, + "requirements": { + "yunohost": ">= 4.0.8" + }, "multi_instance": false, "services": [ "nginx" From 77a907da53c53baffd90c63a98523db9339228f8 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 21 Mar 2021 14:18:32 +0100 Subject: [PATCH 46/74] Update manifest.json --- manifest.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/manifest.json b/manifest.json index 30e4389..75ff971 100644 --- a/manifest.json +++ b/manifest.json @@ -29,7 +29,7 @@ "name": "domain", "type": "domain", "ask": { - "en": "Choose a domain name for musicbox" + "en": "Choose a domain name for Mopidy" }, "example": "example.com" }, @@ -37,11 +37,11 @@ "name": "path", "type": "path", "ask": { - "en": "Choose a path for ynhexample", - "fr": "Choisissez un chemin pour ynhexample" + "en": "Choose a path for Mopidy", + "fr": "Choisissez un chemin pour Mopidy" }, "example": "/example", - "default": "/musicbox" + "default": "/mopidy" }, { "name": "is_public", @@ -50,7 +50,7 @@ "en": "Is it a public application?", "fr": "Est-ce une application publique ?" }, - "default": true + "default": false } ] } From 1c49b7633d108189020d915818090d43a426f470 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 21 Mar 2021 14:42:05 +0100 Subject: [PATCH 47/74] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 83cb6a3..cd64a38 100755 --- a/scripts/install +++ b/scripts/install @@ -66,7 +66,7 @@ ynh_app_setting_set --app=$app --key=port --value=$port # INSTALL DEPENDENCIES #================================================= ynh_script_progression --message="Installing dependencies..." --weight=10 - +pwd #ynh_install_app_dependencies $pkg_dependencies siwi #================================================= From 5a631b73420a4351e2a566a54eb5f4f7e4f606ff Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 21 Mar 2021 17:19:44 +0100 Subject: [PATCH 48/74] Update _common.sh --- scripts/_common.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/scripts/_common.sh b/scripts/_common.sh index 1d0dc49..edc875a 100644 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -16,7 +16,7 @@ pkg_dependencies="build-essential python3-dev python3-pip python3-venv git postg python_version="$(python3 -V | cut -d' ' -f2 | cut -d. -f1-2)" myynh_install() { - ynh_script_progression --message="Install / upgrade mopidy via pip..." --weight=8 +# ynh_script_progression --message="Install / upgrade mopidy via pip..." --weight=8 python3 -m venv "${final_path}/env" chown -R "$app" "$final_path" @@ -27,7 +27,7 @@ myynh_install() { set -o nounset ynh_exec_as $app $final_path/env/bin/pip install --upgrade --no-cache-dir pip - ynh_script_progression --message="Installing essentials..." --weight=17 +# ynh_script_progression --message="Installing essentials..." --weight=17 # to make Gstreamer visible in Python environment $final_path/env/bin/python3 -m pip install vext @@ -39,17 +39,17 @@ myynh_install() { ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-local==3.2.1 ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-MusicBox-Webclient==3.1.0 - ynh_script_progression --message="Installing Mopidy-YouTube..." --weight=7 +# ynh_script_progression --message="Installing Mopidy-YouTube..." --weight=7 ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-YouTube==3.2 - ynh_script_progression --message="Installing Mopidy-YTMusic..." --weight=2 +# ynh_script_progression --message="Installing Mopidy-YTMusic..." --weight=2 ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-YTMusic==0.2.2 - ynh_script_progression --message="Installing Mopidy-RadioNet..." +# ynh_script_progression --message="Installing Mopidy-RadioNet..." ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-RadioNet==0.2.2 - ynh_script_progression --message="Installing Mopidy-Podcast..." +# ynh_script_progression --message="Installing Mopidy-Podcast..." ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-Podcast==3.0.0 - ynh_script_progression --message="Installing Mopidy-Podcast-iTunes..." --weight=2 +# ynh_script_progression --message="Installing Mopidy-Podcast-iTunes..." --weight=2 ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-Podcast-iTunes==3.0.0 - ynh_script_progression --message="Installing Mopidy-SoundCloud..." --weight=6 +# ynh_script_progression --message="Installing Mopidy-SoundCloud..." --weight=6 ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-SoundCloud # ynh_script_progression --message="Installing Mopidy-Spotify..." --time --weight=1 # ynh_exec_as $app $final_path/env/bin/python3 -m pip install --no-cache-dir Mopidy-Spotify Spotify Lib currently not available!! From 67c1737aea08e67c692f6ce96719102214f6271e Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 21 Mar 2021 17:21:02 +0100 Subject: [PATCH 49/74] Update install --- scripts/install | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index cd64a38..60c3878 100755 --- a/scripts/install +++ b/scripts/install @@ -65,7 +65,7 @@ ynh_app_setting_set --app=$app --key=port --value=$port #================================================= # INSTALL DEPENDENCIES #================================================= -ynh_script_progression --message="Installing dependencies..." --weight=10 +ynh_script_progression --message="Installing dependencies..." --weight=30 pwd #ynh_install_app_dependencies $pkg_dependencies siwi @@ -80,7 +80,8 @@ ynh_system_user_create --username="$app" --home_dir="$final_path" --use_shell #================================================= # INSTALL MOPIDY IN PYTHON ENVIRONMENT #================================================= -ynh_script_progression --message="Install in Python environment..." +ynh_script_progression --message="Install in Python environment..." --weight=30 +pwd myynh_install From 1a7e66dc9b70dae926d35a9124d90e04b799034e Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 21 Mar 2021 17:26:52 +0100 Subject: [PATCH 50/74] Update install --- scripts/install | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/install b/scripts/install index 60c3878..e9cbb96 100755 --- a/scripts/install +++ b/scripts/install @@ -67,7 +67,7 @@ ynh_app_setting_set --app=$app --key=port --value=$port #================================================= ynh_script_progression --message="Installing dependencies..." --weight=30 pwd -#ynh_install_app_dependencies $pkg_dependencies siwi +ynh_install_app_dependencies $pkg_dependencies #================================================= # CREATE DEDICATED USER From 388571aef25f5c911f6739b4baee2f28ed5b5d50 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 21 Mar 2021 18:48:35 +0100 Subject: [PATCH 51/74] Update restore --- scripts/restore | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/scripts/restore b/scripts/restore index a8017a8..d6f4608 100755 --- a/scripts/restore +++ b/scripts/restore @@ -20,7 +20,7 @@ ynh_abort_if_errors #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." --time --weight=1 +ynh_script_progression --message="Loading installation settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME @@ -36,7 +36,7 @@ cmd_file="/usr/local/bin/mopidyctl" #================================================= # CHECK IF THE APP CAN BE RESTORED #================================================= -ynh_script_progression --message="Validating restoration parameters..." --time --weight=1 +ynh_script_progression --message="Validating restoration parameters..." --weight=3 test ! -d $final_path \ || ynh_die --message="There is already a directory: $final_path " @@ -62,7 +62,7 @@ ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" #================================================= # RECREATE THE DEDICATED USER #================================================= -ynh_script_progression --message="Recreating the dedicated system user..." --time --weight=1 +ynh_script_progression --message="Recreating the dedicated system user..." --weight=1 # Create the dedicated user (if not existing) ynh_system_user_create --username="$app" --home_dir="$final_path" --use_shell @@ -70,7 +70,7 @@ ynh_system_user_create --username="$app" --home_dir="$final_path" --use_shell #================================================= # RESTORE THE APP MAIN DIR #================================================= -ynh_script_progression --message="Restoring the app main directory..." --time --weight=1 +ynh_script_progression --message="Restoring the app main directory..." --weight=1 ynh_restore_file --origin_path="$final_path" # /opt/yunohost/mopidy @@ -86,7 +86,7 @@ ynh_restore_file --origin_path="$final_path" # /opt/yunohost/mopidy #================================================= # REINSTALL DEPENDENCIES #================================================= -ynh_script_progression --message="Reinstalling dependencies..." --time --weight=1 +ynh_script_progression --message="Reinstalling dependencies..." --weight=50 # Define and install dependencies ynh_install_app_dependencies $pkg_dependencies @@ -94,7 +94,7 @@ ynh_install_app_dependencies $pkg_dependencies #================================================= # RESTORE SYSTEMD #================================================= -ynh_script_progression --message="Restoring the systemd configuration..." --time --weight=1 +ynh_script_progression --message="Restoring the systemd configuration..." --weight=1 ynh_restore_file --origin_path="/etc/systemd/system/$app.service" systemctl enable $app.service --quiet @@ -102,7 +102,7 @@ systemctl enable $app.service --quiet #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= -ynh_script_progression --message="Integrating service in YunoHost..." --time --weight=1 +ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 yunohost service add $app --log_type systemd --description "this is mopidy, a music server" @@ -117,7 +117,7 @@ ynh_restore_file --origin_path="$cmd_file" # /usr/local/bin/mopidyctl #================================================= # START SYSTEMD SERVICE #================================================= -ynh_script_progression --message="Starting a systemd service..." --time --weight=1 +ynh_script_progression --message="Starting a systemd service..." --weight=1 ynh_systemd_action --service_name=$app --action="start" @@ -126,7 +126,7 @@ ynh_systemd_action --service_name=$app --action="start" #================================================= # RELOAD NGINX AND PHP-FPM #================================================= -ynh_script_progression --message="Reloading NGINX web server..." --time --weight=1 +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 ynh_systemd_action --service_name=nginx --action=reload @@ -134,4 +134,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Restoration completed for $app" --time --last +ynh_script_progression --message="Restoration completed for $app" --last From 00dcae5bb979f4d7c43779794988eb6b09c03931 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 21 Mar 2021 19:39:23 +0100 Subject: [PATCH 52/74] Update upgrade --- scripts/upgrade | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 7a7f503..b54e713 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -12,7 +12,7 @@ source /usr/share/yunohost/helpers #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." --time --weight=1 +ynh_script_progression --message="Loading installation settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME @@ -43,7 +43,7 @@ upgrade_type=$(ynh_check_app_version_changed) #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= -ynh_script_progression --message="Ensuring downward compatibility..." --time --weight=1 +ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 # # N.B. : the followings setting migrations snippets are provided as *EXAMPLES* @@ -69,7 +69,7 @@ ynh_script_progression --message="Ensuring downward compatibility..." --time --w #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= -ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." --time --weight=1 +ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." --weight=7 # Backup the current version of the app ynh_backup_before_upgrade @@ -85,7 +85,7 @@ ynh_abort_if_errors #================================================= # STOP SYSTEMD SERVICE #================================================= -ynh_script_progression --message="Stopping a systemd service..." --time --weight=1 +ynh_script_progression --message="Stopping a systemd service..." --weight=1 ynh_systemd_action --service_name=$app --action="stop" @@ -103,7 +103,7 @@ fi #================================================= # NGINX CONFIGURATION #================================================= -ynh_script_progression --message="Upgrading NGINX web server configuration..." --time --weight=1 +ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=2 # Create a dedicated NGINX config ynh_add_nginx_config @@ -111,14 +111,14 @@ ynh_add_nginx_config #================================================= # UPGRADE DEPENDENCIES #================================================= -ynh_script_progression --message="Upgrading dependencies..." --time --weight=1 +ynh_script_progression --message="Upgrading dependencies..." --time --weight=11 ynh_install_app_dependencies $pkg_dependencies #================================================= # CREATE DEDICATED USER #================================================= -ynh_script_progression --message="Making sure dedicated system user exists..." --time --weight=1 +ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 # Create a dedicated user (if not existing) ynh_system_user_create --username="$app" --home_dir="$final_path" --use_shell @@ -128,7 +128,7 @@ ynh_system_user_create --username="$app" --home_dir="$final_path" --use_shell #================================================= # SETUP SYSTEMD #================================================= -ynh_script_progression --message="Upgrading systemd configuration..." --time --weight=1 +ynh_script_progression --message="Upgrading systemd configuration..." --weight=3 # Create a dedicated systemd config start_file="$final_path/env/bin/$app" @@ -171,27 +171,27 @@ chown -R root: $final_path #================================================= # INTEGRATE SERVICE IN YUNOHOST #================================================= -ynh_script_progression --message="Integrating service in YunoHost..." --time --weight=1 +ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 yunohost service add $app --log_type systemd --description "this is mopidy, a music server" #================================================= # START SYSTEMD SERVICE #================================================= -ynh_script_progression --message="Starting a systemd service..." --time --weight=1 +ynh_script_progression --message="Starting a systemd service..." --weight=1 ynh_systemd_action --service_name=$app --action="start" #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." --time --weight=1 +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 ynh_systemd_action --service_name=nginx --action=reload #================================================= # PROVIDE ADDITIONAL SHELL COMAND #================================================= -ynh_script_progression --message="Provide additional shell comand..." --time --weight=1 +ynh_script_progression --message="Provide additional shell comand..." --weight=1 cp -a ../sources/extra_files/mopidyctl "$cmd_file" ynh_replace_string --match_string="__APP__" --replace_string=$app --target_file="$cmd_file" @@ -203,7 +203,7 @@ chmod +x "$cmd_file" #================================================= # SCAN LOCAL MEDIA DIRECTORY #================================================= -ynh_script_progression --message="Scan local media directory..." --weight=1 +ynh_script_progression --message="Scan local media directory..." --weight=3 "$cmd_file" local scan From 17d8aca023efb7bd58fd4bab05eb41aa0c366f17 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 21 Mar 2021 20:42:50 +0100 Subject: [PATCH 53/74] Update manifest.json --- manifest.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/manifest.json b/manifest.json index 75ff971..3de7a83 100644 --- a/manifest.json +++ b/manifest.json @@ -31,6 +31,9 @@ "ask": { "en": "Choose a domain name for Mopidy" }, + "help": { + "en": "public app can be used by anonymous visitors" + } "example": "example.com" }, { From 0e563a23a5ca9935489de57a4209c4f1df9ceb6d Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 21 Mar 2021 21:16:46 +0100 Subject: [PATCH 54/74] Update manifest.json --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 3de7a83..2166809 100644 --- a/manifest.json +++ b/manifest.json @@ -33,7 +33,7 @@ }, "help": { "en": "public app can be used by anonymous visitors" - } + }, "example": "example.com" }, { From 3958cbdf4467cb66b65600b8b34bf005154756b7 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 21 Mar 2021 21:54:38 +0100 Subject: [PATCH 55/74] Update manifest.json --- manifest.json | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/manifest.json b/manifest.json index 2166809..d16f140 100644 --- a/manifest.json +++ b/manifest.json @@ -28,9 +28,6 @@ { "name": "domain", "type": "domain", - "ask": { - "en": "Choose a domain name for Mopidy" - }, "help": { "en": "public app can be used by anonymous visitors" }, @@ -39,20 +36,12 @@ { "name": "path", "type": "path", - "ask": { - "en": "Choose a path for Mopidy", - "fr": "Choisissez un chemin pour Mopidy" - }, "example": "/example", "default": "/mopidy" }, { "name": "is_public", "type": "boolean", - "ask": { - "en": "Is it a public application?", - "fr": "Est-ce une application publique ?" - }, "default": false } ] From 17c5338b7c9f8760a9f30d29137db669cfe3033c Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 21 Mar 2021 21:56:21 +0100 Subject: [PATCH 56/74] Update manifest.json --- manifest.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index d16f140..e59a50e 100644 --- a/manifest.json +++ b/manifest.json @@ -28,9 +28,6 @@ { "name": "domain", "type": "domain", - "help": { - "en": "public app can be used by anonymous visitors" - }, "example": "example.com" }, { @@ -42,6 +39,9 @@ { "name": "is_public", "type": "boolean", + "help": { + "en": "public app can be used by anonymous visitors" + }, "default": false } ] From 4269b07578d7b0990430aff32351cc423118dab5 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 21 Mar 2021 23:40:18 +0100 Subject: [PATCH 57/74] Update manifest.json --- manifest.json | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/manifest.json b/manifest.json index e59a50e..2dab500 100644 --- a/manifest.json +++ b/manifest.json @@ -28,17 +28,28 @@ { "name": "domain", "type": "domain", + "ask": { + "en": "Choose a domain name for Mopidy" + }, "example": "example.com" }, { "name": "path", "type": "path", + "ask": { + "en": "Choose a path for Mopidy", + "fr": "Choisissez un chemin pour Mopidy" + }, "example": "/example", "default": "/mopidy" }, { "name": "is_public", "type": "boolean", + "ask": { + "en": "Is it a public application?", + "fr": "Est-ce une application publique ?" + }, "help": { "en": "public app can be used by anonymous visitors" }, From 6f28c0c9b54fe1cea63d90276799003a5e4ce9e7 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Mon, 22 Mar 2021 00:43:49 +0100 Subject: [PATCH 58/74] Update manifest.json --- manifest.json | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/manifest.json b/manifest.json index 2dab500..e59a50e 100644 --- a/manifest.json +++ b/manifest.json @@ -28,28 +28,17 @@ { "name": "domain", "type": "domain", - "ask": { - "en": "Choose a domain name for Mopidy" - }, "example": "example.com" }, { "name": "path", "type": "path", - "ask": { - "en": "Choose a path for Mopidy", - "fr": "Choisissez un chemin pour Mopidy" - }, "example": "/example", "default": "/mopidy" }, { "name": "is_public", "type": "boolean", - "ask": { - "en": "Is it a public application?", - "fr": "Est-ce une application publique ?" - }, "help": { "en": "public app can be used by anonymous visitors" }, From 21a2bf89abe933679743f73ee0473fa972b68d32 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Mon, 22 Mar 2021 01:09:40 +0100 Subject: [PATCH 59/74] Update change_url --- scripts/change_url | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/scripts/change_url b/scripts/change_url index 9e5cde1..45a28e6 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -24,7 +24,7 @@ app=$YNH_APP_INSTANCE_NAME #================================================= # LOAD SETTINGS #================================================= -ynh_script_progression --message="Loading installation settings..." --time --weight=1 +ynh_script_progression --message="Loading installation settings..." --weight=1 # Needed for helper "ynh_add_nginx_config" final_path=$(ynh_app_setting_get --app=$app --key=path) @@ -33,7 +33,7 @@ port=$(ynh_app_setting_get --app=$app --key=port) #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= -ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --time --weight=1 +ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --weight=15 # Backup the current version of the app ynh_backup_before_upgrade @@ -68,14 +68,14 @@ fi #================================================= # STOP SYSTEMD SERVICE #================================================= -ynh_script_progression --message="Stopping a systemd service..." --time --weight=1 +ynh_script_progression --message="Stopping a systemd service..." --weight=1 ynh_systemd_action --service_name=$app --action="stop" --log_path="/var/log/$app/$app.log" #================================================= # MODIFY URL IN NGINX CONF #================================================= -ynh_script_progression --message="Updating NGINX web server configuration..." --time --weight=1 +ynh_script_progression --message="Updating NGINX web server configuration..." --weight=15 nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf @@ -118,13 +118,13 @@ fi #================================================= # START SYSTEMD SERVICE #================================================= -ynh_script_progression --message="Starting a systemd service..." --time --weight=1 +ynh_script_progression --message="Starting a systemd service..." --weight=1 ynh_systemd_action --service_name=$app --action="start" #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." --time --weight=1 +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 ynh_systemd_action --service_name=nginx --action=reload @@ -132,4 +132,4 @@ ynh_systemd_action --service_name=nginx --action=reload # END OF SCRIPT #================================================= -ynh_script_progression --message="Change of URL completed for $app" --time --last +ynh_script_progression --message="Change of URL completed for $app" --last From bec16d5e4833cb7eae0a410b359b43586a23a660 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Mon, 22 Mar 2021 02:00:54 +0100 Subject: [PATCH 60/74] more tests upgrade noport --- check_process | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check_process b/check_process index 866325d..e49499d 100644 --- a/check_process +++ b/check_process @@ -15,11 +15,11 @@ setup_nourl=0 setup_private=1 setup_public=1 - upgrade=? - upgrade=? from_commit=CommitHash + upgrade=1 +# upgrade=1 from_commit=CommitHash backup_restore=1 multi_instance=0 - port_already_use=0 + port_already_use=1 change_url=1 ;;; Options Email= From 501e1ca09f468d8d15c05679034682842e141917 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Tue, 23 Mar 2021 01:09:43 +0100 Subject: [PATCH 61/74] stay with ask-strings without ask-strings install script not working from webUI --- manifest.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index e59a50e..4001a51 100644 --- a/manifest.json +++ b/manifest.json @@ -3,7 +3,7 @@ "id": "mopidy", "packaging_format": 1, "description": { - "en": "An extensible music server to play music, podcasts and radio programs from local disk and various streaming services" + "en": "plays music, podcasts and radio programs from local disk and various streaming services" }, "version": "3.1.1-ynh2", "url": "https://www.mopidy.com/", @@ -28,17 +28,26 @@ { "name": "domain", "type": "domain", + "ask": { + "en": "Choose a domain name for Calibre-web" + }, "example": "example.com" }, { "name": "path", "type": "path", + "ask": { + "en": "Choose a path for Calibre-web" + }, "example": "/example", "default": "/mopidy" }, { "name": "is_public", "type": "boolean", + "ask": { + "en": "Is it a public application?" + }, "help": { "en": "public app can be used by anonymous visitors" }, From cb1c8c12988c19db4ad1ca3ac0b6532fadf6c1ca Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Tue, 23 Mar 2021 22:11:58 +0100 Subject: [PATCH 62/74] Update manifest.json --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 4001a51..9bad29b 100644 --- a/manifest.json +++ b/manifest.json @@ -5,7 +5,7 @@ "description": { "en": "plays music, podcasts and radio programs from local disk and various streaming services" }, - "version": "3.1.1-ynh2", + "version": "3.1.1-ynh3", "url": "https://www.mopidy.com/", "license": "Apache-2.0", "maintainer": { From 529747ead35ca5c0faa9eaf126aee287cee9f18b Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Wed, 24 Mar 2021 00:46:25 +0100 Subject: [PATCH 63/74] Update upgrade --- scripts/upgrade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index b54e713..b8f752c 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -111,7 +111,7 @@ ynh_add_nginx_config #================================================= # UPGRADE DEPENDENCIES #================================================= -ynh_script_progression --message="Upgrading dependencies..." --time --weight=11 +ynh_script_progression --message="Upgrading dependencies..." --weight=11 ynh_install_app_dependencies $pkg_dependencies @@ -211,4 +211,4 @@ ynh_script_progression --message="Scan local media directory..." --weight=3 # END OF SCRIPT #================================================= -ynh_script_progression --message="Upgrade of $app completed" --time --last +ynh_script_progression --message="Upgrade of $app completed" --last From 08f769a73cb6c39dd22227db0c0d7a8ef5f470b0 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Thu, 25 Mar 2021 11:36:36 +0100 Subject: [PATCH 64/74] delete superfluous command --- scripts/install | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/install b/scripts/install index e9cbb96..2bfaa7d 100755 --- a/scripts/install +++ b/scripts/install @@ -66,7 +66,6 @@ ynh_app_setting_set --app=$app --key=port --value=$port # INSTALL DEPENDENCIES #================================================= ynh_script_progression --message="Installing dependencies..." --weight=30 -pwd ynh_install_app_dependencies $pkg_dependencies #================================================= From a32b0b3a66897bba1b9cb9430a5431ef586c7aab Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Thu, 25 Mar 2021 11:41:09 +0100 Subject: [PATCH 65/74] Update check_process --- check_process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check_process b/check_process index e49499d..8af44f2 100644 --- a/check_process +++ b/check_process @@ -19,7 +19,7 @@ # upgrade=1 from_commit=CommitHash backup_restore=1 multi_instance=0 - port_already_use=1 + port_already_use=1 (6680) change_url=1 ;;; Options Email= From 84f2fc04ae50306c97ac6474ff8650ac4a249d58 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Thu, 25 Mar 2021 12:11:29 +0100 Subject: [PATCH 66/74] delete comment --- scripts/install | 4 ---- 1 file changed, 4 deletions(-) diff --git a/scripts/install b/scripts/install index 2bfaa7d..1500f75 100755 --- a/scripts/install +++ b/scripts/install @@ -124,10 +124,6 @@ ynh_add_systemd_config --others_var="conf_file start_file" # substitute __CO ynh_script_progression --message="Setup config file..." cp ../conf/app.conf "$conf_file" -#if [ -n "$(uname -m | grep arm)" ]; # check CPU (raspberry is armxx) -# then -# cat ../conf/raspberry.conf >> "$conf_file" -#fi ynh_replace_string --match_string="__PORT__" --replace_string=$port --target_file="$conf_file" ynh_replace_string --match_string="__MEDIADIR__" --replace_string=$media_dir --target_file="$conf_file" From 8eff9552e5f42ee00d8ce942eaa6544819e1ffd9 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Thu, 25 Mar 2021 13:09:19 +0100 Subject: [PATCH 67/74] Update upgrade --- scripts/upgrade | 39 +++++++++++---------------------------- 1 file changed, 11 insertions(+), 28 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index b8f752c..26db1a8 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -43,7 +43,7 @@ upgrade_type=$(ynh_check_app_version_changed) #================================================= # ENSURE DOWNWARD COMPATIBILITY #================================================= -ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 +#ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 # # N.B. : the followings setting migrations snippets are provided as *EXAMPLES* @@ -57,15 +57,6 @@ ynh_script_progression --message="Ensuring downward compatibility..." --weight=1 # ynh_app_setting_set --app=$app --key=db_name --value=$db_name #fi -# If final_path doesn't exist, create it -#if [ -z "$final_path" ]; then -# final_path=/var/www/$app -# ynh_app_setting_set --app=$app --key=final_path --value=$final_path -#fi - -### If nobody installed your app before 4.1, -### then you may safely remove these lines - #================================================= # BACKUP BEFORE UPGRADE THEN ACTIVE TRAP #================================================= @@ -93,8 +84,6 @@ ynh_systemd_action --service_name=$app --action="stop" # DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= -# siwi: to be checked - if [ "$upgrade_type" == "UPGRADE_APP" ] then myynh_install @@ -137,7 +126,6 @@ ynh_add_systemd_config --others_var="conf_file start_file" # substitute __CO #================================================= # MODIFY A CONFIG FILE #================================================= -#siwi : to be checked ### Verify the checksum of a file, stored by `ynh_store_file_checksum` in the install script. ### And create a backup of this file if the checksum is different. So the file will be backed up if the admin had modified it. @@ -145,16 +133,16 @@ ynh_backup_if_checksum_is_different --file="$conf_file" cp ../conf/app.conf "$conf_file" -#if [ -n "$(uname -m | grep arm)" ]; # check CPU (raspberry is armxx) -# then -# cat ../conf/raspberry.conf >> "$conf_file" -#fi ynh_replace_string --match_string="__PORT__" --replace_string=$port --target_file="$conf_file" ynh_replace_string --match_string="__MEDIADIR__" --replace_string=$media_dir --target_file="$conf_file" ynh_replace_string --match_string="__CACHE_DIR__" --replace_string=$work_dir/cache --target_file="$conf_file" ynh_replace_string --match_string="__DATA_DIR__" --replace_string=$work_dir/data --target_file="$conf_file" +#================================================= +# STORE THE CONFIG FILE CHECKSUM +#================================================= + # Recalculate and store the checksum of the file for the next upgrade. ynh_store_file_checksum --file="$conf_file" @@ -163,10 +151,11 @@ ynh_store_file_checksum --file="$conf_file" #================================================= # SECURE FILES AND DIRECTORIES #================================================= -# siwi : to be checked +# siwi okay -# Set permissions on app files +# user mopidy needs permission to mkdir on final_path chown -R root: $final_path +chown $app: $final_path #================================================= # INTEGRATE SERVICE IN YUNOHOST @@ -174,6 +163,7 @@ chown -R root: $final_path ynh_script_progression --message="Integrating service in YunoHost..." --weight=1 yunohost service add $app --log_type systemd --description "this is mopidy, a music server" + #================================================= # START SYSTEMD SERVICE #================================================= @@ -184,14 +174,14 @@ ynh_systemd_action --service_name=$app --action="start" #================================================= # RELOAD NGINX #================================================= -ynh_script_progression --message="Reloading NGINX web server..." --weight=1 +ynh_script_progression --message="Reloading NGINX web server..." ynh_systemd_action --service_name=nginx --action=reload #================================================= # PROVIDE ADDITIONAL SHELL COMAND #================================================= -ynh_script_progression --message="Provide additional shell comand..." --weight=1 +ynh_script_progression --message="Provide additional shell comand..." cp -a ../sources/extra_files/mopidyctl "$cmd_file" ynh_replace_string --match_string="__APP__" --replace_string=$app --target_file="$cmd_file" @@ -200,13 +190,6 @@ ynh_replace_string --match_string="__CONF_FILE__" --replace_string=$conf_file chmod +x "$cmd_file" -#================================================= -# SCAN LOCAL MEDIA DIRECTORY -#================================================= -ynh_script_progression --message="Scan local media directory..." --weight=3 - -"$cmd_file" local scan - #================================================= # END OF SCRIPT #================================================= From e741454c27dfc07c7395c5aee8bd021d07ec4ee8 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 28 Mar 2021 11:06:04 +0200 Subject: [PATCH 68/74] correct version format --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 9bad29b..b370fcf 100644 --- a/manifest.json +++ b/manifest.json @@ -5,7 +5,7 @@ "description": { "en": "plays music, podcasts and radio programs from local disk and various streaming services" }, - "version": "3.1.1-ynh3", + "version": "3.1.1~ynh3", "url": "https://www.mopidy.com/", "license": "Apache-2.0", "maintainer": { From eee433e06da4f6ea09f826cd1ceb8b02d7da7c1c Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 28 Mar 2021 11:11:04 +0200 Subject: [PATCH 69/74] reset version numer --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index b370fcf..b0dd1d2 100644 --- a/manifest.json +++ b/manifest.json @@ -5,7 +5,7 @@ "description": { "en": "plays music, podcasts and radio programs from local disk and various streaming services" }, - "version": "3.1.1~ynh3", + "version": "3.1.1~ynh1", "url": "https://www.mopidy.com/", "license": "Apache-2.0", "maintainer": { From 960c816c3889046176450ca361c73b07ec81f0d7 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Sun, 28 Mar 2021 11:59:30 +0200 Subject: [PATCH 70/74] don't test private install --- check_process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check_process b/check_process index 8af44f2..a0605b7 100644 --- a/check_process +++ b/check_process @@ -13,7 +13,7 @@ setup_sub_dir=1 setup_root=1 setup_nourl=0 - setup_private=1 + setup_private=0 setup_public=1 upgrade=1 # upgrade=1 from_commit=CommitHash From b31798d37cdfca237a7dcfd468144099621eb9eb Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Tue, 30 Mar 2021 11:42:59 +0200 Subject: [PATCH 71/74] Update manifest.json Co-authored-by: yalh76 --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index b0dd1d2..3f13688 100644 --- a/manifest.json +++ b/manifest.json @@ -29,7 +29,7 @@ "name": "domain", "type": "domain", "ask": { - "en": "Choose a domain name for Calibre-web" + "en": "Choose a domain name for Mopidy" }, "example": "example.com" }, From c0aa0b1c5accc97c202fb45e92c69b1e1bf897f3 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Tue, 30 Mar 2021 11:43:25 +0200 Subject: [PATCH 72/74] Update manifest.json Co-authored-by: yalh76 --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 3f13688..841ec86 100644 --- a/manifest.json +++ b/manifest.json @@ -37,7 +37,7 @@ "name": "path", "type": "path", "ask": { - "en": "Choose a path for Calibre-web" + "en": "Choose a path for Mopidy" }, "example": "/example", "default": "/mopidy" From 0624d31598dd540f62c07fe7abffa6a336e07f0e Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Tue, 30 Mar 2021 11:48:37 +0200 Subject: [PATCH 73/74] delete superfluous comand after review --- scripts/install | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/install b/scripts/install index 1500f75..3b40bd6 100755 --- a/scripts/install +++ b/scripts/install @@ -80,7 +80,6 @@ ynh_system_user_create --username="$app" --home_dir="$final_path" --use_shell # INSTALL MOPIDY IN PYTHON ENVIRONMENT #================================================= ynh_script_progression --message="Install in Python environment..." --weight=30 -pwd myynh_install From e2a778cc15af4801ff31e4b783c4e9d483686884 Mon Sep 17 00:00:00 2001 From: siwinter <45730097+siwinter@users.noreply.github.com> Date: Wed, 31 Mar 2021 22:44:54 +0200 Subject: [PATCH 74/74] Update check_process --- check_process | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/check_process b/check_process index a0605b7..8cdb500 100644 --- a/check_process +++ b/check_process @@ -12,7 +12,7 @@ pkg_linter=1 setup_sub_dir=1 setup_root=1 - setup_nourl=0 + setup_nourl=1 setup_private=0 setup_public=1 upgrade=1