code:
---
title: Tasks for the next stable version release of Libreboot
...

Libreboot now has an issue tracker, at
<https://notabug.org/libreboot/libreboot/issues>. The purpose of this page is
to list current high priority tasks, which are desirable and/or required for
the next release.

Libreboot releases happen whenever Libreboot is in a state that the maintainers
agree is suitable to be considered for making a new stable release. This is to
be determined by overall consensus, per release.

This page is updated periodically, to reflect the issues currently open on the
bug tracker.

Port x86 to the Paper build system
----------------------------------

<https://notabug.org/libreboot/libreboot/issues/108>

Paper is the new build system in Libreboot, feature-complete for ARM and with
many improvements, but the old build system is still used for x86 Intel and AMD
systems in Libreboot.

Paper has more features, is more modular, is better designed and superior in
terms of maintainability.

Dump coreboot as firmware upstream. Adopt librecore instead
-----------------------------------------------------------

<https://notabug.org/libreboot/libreboot/issues/44>

It may be necessary to keep coreboot, for the ARM chromebooks (rk3288 chipset).

Libreboot is a coreboot distribution, which integrates payloads, utilities,
documentation, additional patches/fixes and integrates everything together.
You can think of it like a GNU+Linux distribution, but it's a distribution of
the boot firmware, not the operating system. Libreboot incorporates coreboot,
deblobbing it with deblob scripts.

Librecore is a whole new fork of coreboot, and it is its own upstream, with
many coreboot developers working on it. It deblobs coreboot in-tree, without
deblob scripts. The only blobs that Librecore distributes is CPU microcode
updates, and we can simply exclude those in Libreboot, just as the current
build system deletes them after it downloads coreboot.

Librecore generally has a much more focused team, and their priority is libre
hardware. It is a very suitable upstream for Libreboot, much more so than the
coreboot project. Librecore is a very new project (formed in December 2016).

See: <http://librecore.info/>
IRC channel (on freenode): #librecore

Its main developers are damo22, avph, funfunctor and others from the #coreboot
IRC channel. Of interest: damo22 and avph used to work for Libreboot, before
forming the Librecore project.

Current board fixes in Libreboot's git repository, not in the current stable
release of Libreboot:

-   gm45: use correct vbt string (needed for external monitors)
-   i945: add fake vbt (needed for external screens)
-   ga-g41m-es2l: enable use of PCIe x16 port
-   i945: add support for external monitors in grub
-   add vesafb mode to ga-g41m-es2l
-   gm45: add support for external monitors in grub
-   Fix low-res screens on T60
-   add hda verb to t60 (fixes mic)
-   gm45: fix IOMMU

There may be others. The above patches are most likely already merged in
Librecore's main Git repository. This should be investigated. If so, then they
can be deleted from Libreboot since they would already be merged upstream.

Reproducible builds
-------------------

<https://notabug.org/libreboot/libreboot/issues/15>

NOTE: Integrate librecore first.

NOTE: Finish Paper integration first.

ThinkPad X220 support
---------------------

<https://notabug.org/libreboot/libreboot/issues/48>

NOTE: Merge after Librecore is adopted in Libreboot.

ThinkPad T400S support
----------------------

<https://notabug.org/libreboot/libreboot/issues/7>

NOTE: Merge after Librecore is adopted in Libreboot.

Lenovo G505S support
--------------------

<https://notabug.org/libreboot/libreboot/issues/104>

NOTE: Merge after Librecore is adopted in Libreboot.

ThinkPad W500 support
---------------------

<https://notabug.org/libreboot/libreboot/issues/87>

Merge this upstream in coreboot and librecore, and port downstream to
Libreboot

NOTE: Merge after Librecore is adopted in Libreboot.

ThinkPad R500 support
---------------------

<https://notabug.org/libreboot/libreboot/issues/107>

Merge this upstream in coreboot and librecore, and port downstream to
Libreboot.

NOTE: Merge after Librecore is adopted in Libreboot.

Fix broken reboot on Intel D510MO
---------------------------------

<https://notabug.org/libreboot/libreboot/issues/103>

NOTE: Investigate this in Librecore. Libreboot is abandoning coreboot.

Fedora doesn't boot on Libreboot systems. Fix that
--------------------------------------------------

<https://notabug.org/libreboot/libreboot/issues/102>

This is a Fedora issue.

TODO: Consider closing this bug (report it to Fedora instead).
NOTE: This is most likely E\_NOT\_OUR\_BUG.

Add support for various i945 desktops
-------------------------------------

<https://notabug.org/libreboot/libreboot/issues/45>

NOTE: Investigate this in Librecore. Libreboot is abandoning coreboot.

Adopt Unofficial BASH Strict Mode in the entire build system (Paper)
--------------------------------------------------------------------

<https://notabug.org/libreboot/libreboot/issues/84>

NOTE: Merge x86 into Paper build system first.

Investigate GPU hanging issue on GM45 laptops
---------------------------------------------

<https://notabug.org/libreboot/libreboot/issues/62>

Fix this in Librecore, if possible. Otherwise, submit bug report (regression)
on Linux kernel bug tracker.

NOTE: Investigate this in Librecore. Libreboot is abandoning coreboot.

Fix or work around for issues with dock drive hotplug detection on Linux 4.10.x
-------------------------------------------------------------------------------

<https://notabug.org/libreboot/libreboot/issues/61>

NOTE: Investigate this in Librecore. Libreboot is abandoning coreboot.

Fix Parabola build issue for cbfstool in coreboot
-------------------------------------------------

<https://notabug.org/libreboot/libreboot/issues/59>

This may already be fixed in Librecore, our future upstream.

NOTE: This may affect any GNU+Linux distribution which uses a modern toolchain.

Disable framebuffer backdoor on SandyBridge (for ThinkPad X220)
---------------------------------------------------------------

<https://notabug.org/libreboot/libreboot/issues/58>

NOTE: Investigate this in Librecore. Libreboot is abandoning coreboot.

Add SeaBIOS payload option for all x86 boards in Libreboot
----------------------------------------------------------

<https://notabug.org/libreboot/libreboot/issues/55>

Fix boot issue for Debian and other systems (and fix FDE in grub.cfg)
---------------------------------------------------------------------

<https://notabug.org/libreboot/libreboot/issues/54>

i945 and GM45: Support fine tuning BLC\_PWM\_CTL register value in CBFS
-----------------------------------------------------------------------

<https://notabug.org/libreboot/libreboot/issues/50>

NOTE: Investigate this in Librecore. Libreboot is abandoning coreboot.

Add support for low-power cstates on MacBook2,1
-----------------------------------------------

<https://notabug.org/libreboot/libreboot/issues/49>

NOTE: Investigate this in Librecore. Libreboot is abandoning coreboot.

Implement support for T400 docking station
------------------------------------------

<https://notabug.org/libreboot/libreboot/issues/46>

NOTE: Investigate this in Librecore. Libreboot is abandoning coreboot.

Bug: KGPE-D16 stuck at: calibrating apic timer
----------------------------------------------

<https://notabug.org/libreboot/libreboot/issues/39>

NOTE: Investigate this in Librecore. Libreboot is abandoning coreboot.


code:
<!DOCTYPE html>

  <meta charset="utf-8">
  <meta name="generator" content="pandoc">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
$for(author-meta)$
  <meta name="author" content="$author-meta$">
$endfor$
$if(date-meta)$
  <meta name="dcterms.date" content="$date-meta$">
$endif$
$if(keywords)$
  <meta name="keywords" content="$for(keywords)$$keywords$$sep$, $endfor$">
$endif$
  <title>$if(title-prefix)$$title-prefix$ – $endif$$pagetitle$</title>

$if(quotes)$

$endif$
$if(highlighting-css)$

$endif$
$for(css)$
  <link rel="stylesheet" href="$css$">
$endfor$
$if(math)$
  $math$
$endif$
$for(header-includes)$
  $header-includes$
$endfor$
<link rel="alternate" type="application/rss+xml" title="RSS Feed" href="/feed.xml"/>

$for(include-before)$
$include-before$
$endfor$
$if(title)$

$title$

$if(subtitle)$

$subtitle$

$endif$
$for(author)$

$author$

$endfor$
$if(date)$

$date$

$endif$

$endif$
$if(return)$
$return$
$endif$
$if(toc)$

$toc$

$endif$
$body$
$for(include-after)$
$include-after$
$endfor$

repo_name: consts/libreboot

license: mit


code:
The Freepost community <https://freepo.st>. Specifically, the following people:

fr33domlover <fr33domlover@rel4tion.org>

path: AUTHORS


code:
If you have a local clone of the repository, you can see a detailed list of
changes using:

  $ git log

There is also a web interface in NotABug which can display commit history.

path: ChangeLog


code:
Install from Hackage:

    $ cabal install funbot-ext-events

Install from unpacked release tarball or source repo:

    $ cd funbot-ext-events
    $ cabal install

Just play with it without installing:

    $ cabal build
    $ cabal repl

path: INSTALL


code:
This file lists the user-visible interesting changes between releases. For a
full list of changes to the source, see the ChangeLog.

funbot-ext-events 0.3.0.0 -- 2016-01-27
=======================================

General, build and documentation changes:

* Write doc comments for all the types and their fields

New APIs, features and enhancements:

* Add file lists to Commit
* Add an issue event type
* Add a note event type
* Move the entire API from `String` to strict `Text`
* Repo identification based on host, namespace and name

Bug fixes:

* (None)

Dependency changes:

* (None)

funbot-ext-events 0.2.0.0 -- 2015-12-17
=======================================

General, build and documentation changes:

* (None)

New APIs, features and enhancements:

* Add welcome event

Bug fixes:

* (None)

Dependency changes:

* (None)

funbot-ext-events 0.1.0.0 -- 2015-09-19
=======================================

General, build and documentation changes:

* (This is the first release, so everything is new)

New APIs, features and enhancements:

* (This is the first release, so everything is a new feature)

Bug fixes:

* (This is just the first release, many bugs haven't been discovered yet)

Dependency changes:

* (This is the first release)


code:
# funbot-ext-events

This is a Haskell library providing types and tools for interacting with
[FunBot][funbot]'s external events. The code was extracted from FunBot itself,
so that independent programs can interact with it using its client API.

Since the provided types change every time an external event type is added or
modified, many of this library's releases are expected to break compatibility.
In most cases you should either use a higher-level library such as
[funbot-client][funbot-client], or perhaps create one yourself.

[funbot]:        https://notabug.org/fr33domlover/funbot
[funbot-client]: https://notabug.org/fr33domlover/funbot-client

See the .cabal file for more info and link to project website and version
control.

The official download location is the Git repository:

<https://notabug.org/fr33domlover/funbot-ext-events.git>

Occasionally, releases may be made to Hackage, the Haskell package repository.
See <http://hackage.haskell.org/package/funbot-ext-events>.

This library is free software, and is committed to software freedom. It is
released to the public domain using the CC0 Public Domain Dedication. For the
boring "legal" details see the file `COPYING`.

See the file `INSTALL` for hints on installation. The file `ChangeLog` explains
how to see the history log of the changes done in the code. `NEWS` provides a
friendly overview of the changes for each release.

## Bug and Patches

See [here](https://notabug.org/fr33domlover/funbot#reporting-bugs-and-suggesting-features).


code:
import Distribution.Simple
main = defaultMain


code:
name:                funbot-ext-events
version:             0.3.0.0
synopsis:            Interact with FunBot's external events.
description:
  This is a library providing types and tools for interacting with
  <https://notabug.org/fr33domlover/funbot FunBot>'s external events. The
  code was extracted from FunBot itself, so that independent programs can
  interact with it, e.g. by using its client API.

  Since the provided types change every time an external event type is added or
  modified, many of this library's releases are expected to break
  compatibility.  In most cases you should either use a higher-level library
  such as <https://notabug.org/fr33domlover/funbot-client funbot-client>, or
  perhaps create one yourself.
homepage:            https://notabug.org/fr33domlover/funbot-ext-events
bug-reports:         https://notabug.org/fr33domlover/funbot-ext-events/issues
license:             PublicDomain
license-file:        COPYING
author:              fr33domlover
maintainer:          fr33domlover@riseup.net
copyright:           ♡ Copying is an act of love. Please copy, reuse and share.
category:            Network, Web
build-type:          Simple
extra-source-files:  AUTHORS ChangeLog COPYING INSTALL NEWS.md README.md
cabal-version:       >=1.10

source-repository head
  type:                git
  location:            https://notabug.org/fr33domlover/funbot-ext-events.git

library
  exposed-modules:     FunBot.ExtEvents
  -- other-modules:
  -- other-extensions:
  build-depends:       aeson >=0.7
                     , base  >=4.7 && <5
                     , text  >=1
  hs-source-dirs:      src
  default-language:    Haskell2010
  ghc-options:         -Wall


code:
{- This file is part of funbot-ext-events.
 -
 - Written in 2015 by fr33domlover <fr33domlover@rel4tion.org>.
 -
 - ♡ Copying is an act of love. Please copy, reuse and share.
 -
 - The author(s) have dedicated all copyright and related and neighboring
 - rights to this software to the public domain worldwide. This software is
 - distributed without any warranty.
 -
 - You should have received a copy of the CC0 Public Domain Dedication along
 - with this software. If not, see
 - <http://creativecommons.org/publicdomain/zero/1.0/>.
 -}

-- For json field names
{-# LANGUAGE OverloadedStrings #-}

module FunBot.ExtEvents
    ( Repository (..)
    , ProjectObject (..)
    , Commit (..)
    , Push (..)
    , Tag (..)
    , Issue (..)
    , Note (..)
    , MergeRequest (..)
    , NewsItem (..)
    , Paste (..)
    , ExtEvent (..)
    )
where

import Control.Applicative
import Data.Aeson
import Data.Aeson.Types (Parser, typeMismatch)
import Data.Text (Text)

-- | A version control repository.
data Repository = Repository
    { -- | The repository's name. For example, @funbot-ext-events@.
      repoName  :: Text
      -- | The repository's namespace, i.e. username or team name under which
      -- the repository is being managed. For example, @fr33domlover@.
    , repoSpace :: Text
      -- | Network location where the repository is hosted. For now this should
      -- in most cases be the website URL's host part, but could be something
      -- else if/when we have distributed repository sharing. For example,
      -- @notabug.org@.
    , repoHost  :: Text
    }
    deriving Show

instance FromJSON Repository where
    parseJSON (Object o) =
        Repository <$>
        o .: "name" <*>
        o .: "space" <*>
        o .: "host"
    parseJSON v          = typeMismatch "Repository" v

instance ToJSON Repository where
    toJSON repo = object
        [ "name"  .= repoName  repo
        , "space" .= repoSpace repo
        , "host"  .= repoHost  repo
        ]

-- | An object that is part of a project, such as a merge request or an issue
-- or a series of commits being pushed.
data ProjectObject a = ProjectObject
    { -- | The project repository.
      poRepo :: Repository
      -- | The object itself.
    , poObj  :: a
    }
    deriving Show

instance FromJSON a => FromJSON (ProjectObject a) where
    parseJSON (Object o) =
        ProjectObject <$>
        o .: "repo" <*>
        o .: "obj"
    parseJSON v          = typeMismatch "ProjectObject" v

instance ToJSON a => ToJSON (ProjectObject a) where
    toJSON po = object
        [ "repo" .= poRepo po
        , "obj"  .= poObj  po
        ]

-- | A version control system commit, i.e. a set of changes with a description.
data Commit = Commit
    { -- | The author name. For example, @John Doe@.
      commitAuthor   :: Text
      -- | The commit title. For example, @Support encrypted messages@.
    , commitTitle    :: Text
      -- | A web view URL at which the commit details can be displayed.
    , commitUrl      :: Text
      -- | A list of files (relative to the repository top level) added to the
      -- repository in this commit. For example, @src\/FunBot\/ExtEvents.hs@.
    , commitAdded    :: [Text]
      -- | A list of files modified in the repository in this commit.
    , commitModified :: [Text]
      -- | A list of files removed from the repository in this commit.
    , commitRemoved  :: [Text]
    }
    deriving Show

instance FromJSON Commit where
    parseJSON (Object o) =
        Commit <$>
        o .: "author" <*>
        o .: "title" <*>
        o .: "url" <*>
        o .: "added" <*>
        o .: "modified" <*>
        o .: "removed"
    parseJSON v          = typeMismatch "Commit" v

instance ToJSON Commit where
    toJSON (Commit author title url added modified removed) = object
        [ "author"   .= author
        , "title"    .= title
        , "url"      .= url
        , "added"    .= added
        , "modified" .= modified
        , "removed"  .= removed
        ]

-- | A version control push operation, i.e. one or more commits being added to
-- a specific branch or a repsitory. Note that tags can be pushed too, but for
-- that see the 'Tag' type.
data Push = Push
    { pushBranch  :: Text
    , pushCommits :: [Commit]
    }
    deriving Show

instance FromJSON Push where
    parseJSON (Object o) =
        Push <$>
        o .: "branch" <*>
        o .: "commits"
    parseJSON v          = typeMismatch "Push" v

instance ToJSON Push where
    toJSON (Push branch commits) = object
        [ "branch"  .= branch
        , "commits" .= commits
        ]

-- | A version control tag. Allows a specific state of the repository to be
-- referred by name.
data Tag = Tag
    { -- | Tag author name, for example @John Doe@.
      tagAuthor :: Text
      -- | Tag label, for example @0.3.4.1@ (referring to a release version).
    , tagRef    :: Text
    }
    deriving Show

instance FromJSON Tag where
    parseJSON (Object o) =
        Tag <$>
        o .: "author" <*>
        o .: "ref"
    parseJSON v          = typeMismatch "Tag" v

instance ToJSON Tag where
    toJSON tag = object
        [ "author" .= tagAuthor tag
        , "ref"    .= tagRef tag
        ]

-- | A bug, request or other work item attached to a project.
data Issue = Issue
    { -- | Issue author name. For example, @John Doe@.
      issueAuthor    :: Text
      -- | The issue's unique identifier.
    , issueId        :: Int
      -- | Issue title text.
    , issueTitle     :: Text
      -- | A web view URL at which the issue's details can be viewed and
      -- perhaps modified.
    , issueUrl       :: Text
      -- | An action being applied to the issue, which is causing the event to
      -- be sent to the FunBot instance.
    , issueAction    :: Text
    }
    deriving Show

instance FromJSON Issue where
    parseJSON (Object o) =
        Issue <$>
        o .: "author" <*>
        o .: "id" <*>
        o .: "title" <*>
        o .: "url" <*>
        o .: "action"
    parseJSON v          = typeMismatch "Issue" v

instance ToJSON Issue where
    toJSON issue = object
        [ "author" .= issueAuthor issue
        , "id"     .= issueId issue
        , "title"  .= issueTitle issue
        , "url"    .= issueUrl issue
        , "action" .= issueAction issue
        ]

-- | A comment made on some project object.
data Note = Note
    { -- | Note author name, e.g. @John Doe@.
      noteAuthor    :: Text
      -- | Note content for the bot to display. Since notes can be long, this
      -- should be only the portion for the bot to display. The bot should
      -- examine this field and shorten long notes, but you shouldn't rely on
      -- it and provide the right short part here.
    , noteContent   :: Text
      -- | The project object being commented on, e.g. @issue #419@.
    , noteTarget    :: Text
      -- | A web view URL at which the note can be viewed.
    , noteUrl       :: Text
    }
    deriving Show

instance FromJSON Note where
    parseJSON (Object o) =
        Note <$>
        o .: "author" <*>
        o .: "content" <*>
        o .: "target" <*>
        o .: "url"
    parseJSON v          = typeMismatch "Note" v

instance ToJSON Note where
    toJSON (Note author content target url) = object
        [ "author"  .= author
        , "content" .= content
        , "target"  .= target
        , "url"     .= url
        ]

-- | A request from a user to merge their code changes into the project.
data MergeRequest = MergeRequest
    { -- | Merge request author name, e.g. @John Doe@.
      mrAuthor    :: Text
      -- | Merge request unique identifier.
    , mrId        :: Int
      -- | Merge request title.
    , mrTitle     :: Text
      -- | A web view URL at which the merge request can be viewed and perhaps
      -- edited.
    , mrUrl       :: Text
      -- | An action being applied to the merge request, which is causing the
      -- event to be sent to the FunBot instance.
    , mrAction    :: Text
    }
    deriving Show

instance FromJSON MergeRequest where
    parseJSON (Object o) =
        MergeRequest <$>
        o .: "author" <*>
        o .: "id" <*>
        o .: "title" <*>
        o .: "url" <*>
        o .: "action"
    parseJSON v          = typeMismatch "MergeRequest" v

instance ToJSON MergeRequest where
    toJSON mr = object
        [ "author" .= mrAuthor mr
        , "id"     .= mrId mr
        , "title"  .= mrTitle mr
        , "url"    .= mrUrl mr
        , "action" .= mrAction mr
        ]

-- | A news feed item.
data NewsItem = NewsItem
    { -- | Short label identifying the new feed to which the item belongs.
      itemFeedLabel :: Text
      -- | The name of the feed to which the item belongs.
    , itemFeedTitle :: Maybe Text
      -- | Item title.
    , itemTitle     :: Text
      -- | Item author name.
    , itemAuthor    :: Maybe Text
      -- | URL at which the item's content can be viewed.
    , itemUrl       :: Maybe Text
    }
    deriving Show

instance FromJSON NewsItem where
    parseJSON (Object o) =
        NewsItem <$>
        o .: "feed-label" <*>
        o .: "feed-title" <*>
        o .: "title" <*>
        o .: "author" <*>
        o .: "url"
    parseJSON v          = typeMismatch "NewsItem" v

instance ToJSON NewsItem where
    toJSON (NewsItem fLabel fTitle title author url) = object
        [ "feed-label" .= fLabel
        , "feed-title" .= fTitle
        , "title"      .= title
        , "author"     .= author
        , "url"        .= url
        ]

-- | A piece of text uploaded to a website for quick sharing.
data Paste = Paste
    { -- | Paste author name or IRC nickname.
      pasteAuthor  :: Text
      -- | Verb indicating the action done with the paste.
    , pasteVerb    :: Text
      -- | Paste title.
    , pasteTitle   :: Text
      -- | URL at which the paste content can be viewed.
    , pasteUrl     :: Text
      -- | An IRC channel into which to announce the paste.
    , pasteChannel :: Text
    }
    deriving Show

instance FromJSON Paste where
    parseJSON (Object o) =
        Paste <$>
        o .: "author" <*>
        o .: "verb" <*>
        o .: "title" <*>
        o .: "url" <*>
        o .: "channel"
    parseJSON v          = typeMismatch "Paste" v

instance ToJSON Paste where
    toJSON (Paste author verb title url chan) = object
        [ "author"  .= author
        , "verb"    .= verb
        , "title"   .= title
        , "url"     .= url
        , "channel" .= chan
        ]

-- | An event coming from one of the external event sources.
data ExtEvent
    -- | Git commits pushed into a repo.
    = GitPushEvent (ProjectObject Push)
    -- | A git tag pushed into a repo.
    | GitTagEvent (ProjectObject Tag)
    -- | An issue related event.
    | IssueEvent (ProjectObject Issue)
    -- | A merge request related event.
    | MergeRequestEvent (ProjectObject MergeRequest)
    -- | A comment made on an issue or MR or some other object.
    | NoteEvent (ProjectObject Note)
    -- | New news item published.
    | NewsEvent NewsItem
    -- | Paste related event in a paste server.
    | PasteEvent Paste
    -- | A new IRC user needs to be welcomed to a channel.
    | WelcomeEvent Text Text
    deriving Show

text :: Parser Text -> Text -> Parser Text
text parser expected = do
    got <- parser
    if got == expected
        then return got
        else empty

instance FromJSON ExtEvent where
    parseJSON (Object o) =
        let kind = text $ o .: "type"
            event label ctor = kind label *> (ctor <$> o .: "data")
        in  event "push"  GitPushEvent      <|>
            event "tag"   GitTagEvent       <|>
            event "mr"    MergeRequestEvent <|>
            event "note"  NoteEvent         <|>
            event "issue" IssueEvent        <|>
            event "news"  NewsEvent         <|>
            event "paste" PasteEvent
    parseJSON v          = typeMismatch "ExtEvent" v

instance ToJSON ExtEvent where
    toJSON (GitPushEvent commits) = object [ "type" .= ("push" :: Text)
                                           , "data" .= commits
                                           ]
    toJSON (GitTagEvent tag)      = object [ "type" .= ("tag" :: Text)
                                           , "data" .= tag
                                           ]
    toJSON (IssueEvent issue)     = object [ "type" .= ("issue" :: Text)
                                           , "data" .= issue
                                           ]
    toJSON (MergeRequestEvent mr) = object [ "type" .= ("mr" :: Text)
                                           , "data" .= mr
                                           ]
    toJSON (NoteEvent note)       = object [ "type" .= ("note" :: Text)
                                           , "data" .= note
                                           ]
    toJSON (NewsEvent item)       = object [ "type" .= ("news" :: Text)
                                           , "data" .= item
                                           ]
    toJSON (PasteEvent paste)     = object [ "type" .= ("paste" :: Text)
                                           , "data" .= paste
                                           ]
    toJSON (WelcomeEvent _ _)     = object []


code:
# ---> BricxCC
# Bricx Command Center IDE
# http://bricxcc.sourceforge.net
*.bak
*.sym

# ---> Java
*.class

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.ear

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

# ---> Python
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*,cover

# Translations
*.mo
*.pot

# Django stuff:
*.log

# Sphinx documentation
docs/_build/

# PyBuilder
target/

repo_name: alive/v

path: .gitignore


warningText: 防止失效 关注公众号:『魅力耿城』,接口免费整理维护

😘 | 关注公众号【魅力耿城】

key: 豆瓣

✨盒锦豆瓣💢

key: 豆瓣[JS]

😃 | 荐片

key: 荐片

😉 | 低端

key: 低端影视

😊 | 厂长

key: 厂长

😋 | 达龟

key: 达达龟

😂 | 玩偶

key: 玩偶哥哥

😚 | 云播

key: TVB云播

😇 | 熊掌

key: 熊掌

😐 | 美益

key: 益达影视

😏 | 农民

key: 农民影视

😣 | 奈飞

key: 奈飞影视

😮 | 飞播

key: 奈飞中文

😯 | 兄弟

key: 兄弟影视

😭 | VIP

key: VIP影视

😦 | 南瓜

key: 南瓜

😧 | 七新

key: 七新影视

😬 | 土豪

key: 土豪影视

😱 | 圣城

key: 圣城影视

👿 | 米爱

key: 米爱影视

🛫┃豪华

key: 豪华资源

🎀┃索尼

key: 索尼资源

🐺┃新浪

key: 新浪资源

✈┃飞刀

key: feidaozy资源

🐮┃红牛

key: 红牛资源

🗿┃优质

key: 🗿优质资源

🐉┃卧龙

key: 🐉卧龙资源

🆔┃百度

key: 🆔百度资源

🈁┃CK

key: 🈁CK资源

🎐┃光速

key: 🎀光速资源

🎊┃极速

key: 🎀极速资源

📺┃暴风

key: 🎀暴风资源

👽┃高清

key: 👽高清资源

🆖┃ikun

key: 🆖ikun资源

🎪┃量子

key: 🎪量子资源

🚁┃飞速

key: 🚁飞速资源

🌞┃天空

key: 🌞天空资源

🆕┃非凡

key: 🆕非凡资源

😀 | 麻衣

key: 麻衣呀呼

😁 | 热播

key: 热播之家

😂 | 魔力

key: HDmoli

😃 | 策驰

key: 策驰影院

😆 | 频库

key: Vidhub视频

😉 | 石榴

key: 石榴影视

😊 | 两个

key: 两个BT

😋 | 七年

key: 七年影视

😍 | 量子

key: lzi

😘 | 非凡

key: 非凡资源

😗 | 拳皇

key: 拳皇争霸

😗 | 短剧

key: csp短剧网

😚 | 爱艺

key: 爱奇异

😇 | 酷官

key: 优酷

😛 | 讯官

key: 腾讯

😝 | 芒官

key: 芒果

😔 | 搜官

key: 搜狗

📀 | 小纸条(搜索)

key: Gitcafe

📀 | 找资源(搜索)

username: fanty

🏮 | 相声小品

key: 相声小品

🎈 | 国粹戏曲

key: 戏 曲

🎸 | 演唱会

key: 演唱会

🐧 | 企鹅体育

type: rect

⚽ | 88看球

key: 88看球

⚽ | JRKAN直播

key: JRKAN直播

🐯 | 虎牙直播

key: 虎牙直播

🐟 | 斗鱼直播

key: 斗鱼直播

🐰 | 兔小贝

key: 兔小贝

🅱 | 哔哩大全

key: 哔哩哔哩

🅱 | 哔哩直播

key: 哔哩直播

📚 | 学习园地

key: 学习园地

📚 | 学外语

key: 学外语

📚 | 听书喜马

key: 喜马拉雅

🎧DJ呦呦音乐

key: DJ呦呦音乐网

🎧 | 明星MV

key: MTV

Web聚合

url: Web

咸鱼

user-agent: Mozilla/5.0 (Linux; Android 13; V2049A Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36

虾米

user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.57

爱酷

flag: qq 腾讯 qiyi 爱奇艺 奇艺 youku 优酷 mgtv 芒果 letv 乐视 pptv PPTV sohu bilibili 哔哩哔哩 哔哩

flags: youku qq iqiyi qiyi letv sohu tudou pptv mgtv wasu bilibili renrenmi

rule: cdn-tos obj/tos-cn

暴风

hosts: bfzy bfbfvip

磁力广告

regex:
更多
社 區
x u u
最 新
更 新
社 区
有趣
有 趣
英皇体育
全中文AV在线
澳门皇冠赌场
哥哥快来
美女荷官
裸聊
新片首发
UUE29

group: 软解码

fflags

value: fastseek

group: 硬解码


请求头: cainisi

数组: 数组=&&=数组

搜索数组: 数组=&&=数组

线路数组: 线路数组=&&=线路数组

播放数组: 播放数组=&&=播放数组

播放列表: 播放列表=&&=播放列表

剧情

key: class

n: 全部

n: 喜剧

v: 喜剧

n: 爱情

v: 爱情

n: 动作

v: 动作

n: 恐怖

v: 恐怖

n: 科幻

v: 科幻

n: 剧情

v: 剧情

n: 犯罪

v: 犯罪

n: 奇幻

v: 奇幻

n: 战争

v: 战争

n: 悬疑

v: 悬疑

n: 动画

v: 动画

n: 文艺

v: 文艺

n: 纪录

v: 纪录

n: 传记

v: 传记

n: 歌舞

v: 歌舞

n: 古装

v: 古装

n: 历史

v: 历史

n: 惊悚

v: 惊悚

n: 伦理

v: 伦理

n: 其他

v: 其他

地区

key: area

n: 内地

v: 大陆

n: 中国香港

v: 香港

n: 中国台湾

v: 台湾

n: 泰国

v: 泰国

n: 美国

v: 美国

n: 韩国

v: 韩国

n: 日本

v: 日本

n: 法国

v: 法国

n: 英国

v: 英国

n: 德国

v: 德国

n: 印度

v: 印度

明星

key: act

n: 成龙

v: 成龙

n: 周星驰

v: 周星驰

n: 李连杰

v: 李连杰

n: 林正英

v: 林正英

n: 吴京

v: 吴京

n: 徐峥

v: 徐峥

n: 黄渤

v: 黄渤

n: 王宝强

v: 王宝强

n: 李小龙

v: 李小龙

n: 张国荣

v: 张国荣

n: 洪金宝

v: 洪金宝

n: 姜文

v: 姜文

n: 沈腾

v: 沈腾

n: 邓超


code:
muban.短视2.二级.img = '.detail-pic&&img&&data-src';
var rule = {
    title: 'NyaFun',
    模板:'短视2',
    host: 'https://www.nyafun.net',
    homeUrl:'/map.html',
	url: '/index.php/api/vod#type=fyclass&page=fypage',
    class_name:'番剧&剧场',
    class_url:'2&1',
    detailUrl:'/bangumi/fyid.html',
    推荐:'.border-box .public-list-box;a&&title;.lazy&&data-src;.public-list-prb&&Text;a&&href',
    double: false, // 推荐内容是否双层定位
}


副标题: pic-text text-right">&&</b>

图片: data-original="&&"

影片类型: <div class="module-info-tag">&&立即播放

导演: 导演：&&</div>

主演: 主演：&&</div>

简介: 【🌙魅力TV】提醒您请勿相信影片中的广告，以免上当受骗。为防失联，请关注公众号[魅力耿城]。+introduction-content">&&</span>

线路数组: [替换:非云>>高清无广告][排序:高清无广告][不包含:无尽云播]


作者: 荷城茶秀

站名: 圣城影视

简介: 【🌙魅力耿城】提醒您请勿相信影片中的广告，以免上当受骗。防失联请关注公众号【魅力耿城】。+剧情：&&

影片状态: 集数：&&</div>

影片类型: icon-cate-ds">&&</a>

数组: module-item-pic">&&module-item">

标题: title="&&"

副标题: module-item-text"&&</div>

图片: data-src="&&"

搜索数组: lazy lazyload"&&<h3>[不包含:肥猫不肥#神秘的哥哥]

搜索图片: data-src="&&"

线路数组: data-dropdown-value=&&</div>[排序:蓝光ZK][不包含:备用#鸡儿云#飞速云#新浪云#金鹰云#火狐云]

播放数组: sort-item"&&</div>

分类: 电影4K$1#电视剧4K$2#综艺4K$3#动漫4K$4#bilibli4K$5#记录片4K$6#奈飞片库4K$7#4K片库$8#次元城片库$9


type_name: 粤语

type_id: 粤语歌曲

type_name: 国语

type_id: 国语歌曲

type_id: 2023年热们歌曲

type_name: 经典老歌

type_id: 经典老歌

type_name: 古风歌曲

type_id: 古风歌曲

type_name: 抖音热歌

type_id: 抖音热歌

type_name: 小姐姐

type_id: 石原里美

type_name: DJ

type_id: DJ歌曲

type_name: 网红翻唱

type_id: 网红翻唱歌曲

type_name: 韩国女团

type_id: 韩国女团演唱会

type_name: A阿黛尔

type_id: 阿黛尔演唱会

type_name: Blackpink

type_id: blackpink演唱会

type_name: Beyond

type_id: beyond演唱会

type_name: B坂井泉水

type_id: 坂井泉水演唱会

type_name: B宝丽金

type_id: 宝丽金演唱会

type_name: B布兰妮

type_id: 布兰妮演唱会

type_name: C崔健

type_id: 催件演唱会

type_name: Coldplay

type_id: coldplay演唱会

type_name: C陈慧娴

type_id: 陈慧娴演唱会

type_name: C陈百强

type_id: 陈百强演唱会

type_name: C陈淑桦

type_id: 陈淑桦演唱会

type_name: C陈慧琳

type_id: 陈慧琳演唱会

type_name: D邓丽君

type_id: 邓丽君演唱会

type_name: D邓紫棋

type_id: 邓紫棋演唱会

type_name: D刀郎

type_id: 刀郎演唱会

type_name: D达明一派

type_id: 刘以达歌曲

type_name: F费玉清

type_id: 费玉清演唱会

type_name: G谷村新司

type_id: 谷村新司演唱会

type_name: G郭富城

type_id: 郭富城演唱会

type_name: G关淑怡

type_id: 关淑怡演唱会

type_name: H黄凯芹

type_id: 黄凯芹演唱会

type_name: J降央卓玛

type_id: 降央卓玛演唱会

type_name: J江慧

type_id: 江慧歌曲

type_name: J吉永小百合

type_id: 吉永小百合歌曲

type_name: J金庸

type_id: 金庸影视歌曲

type_name: L刘德华

type_id: 刘德华演唱会

type_name: Lady Gaga

type_id: Lady Gaga演唱会

type_name: L龙飘飘

type_id: 龙飘飘演唱会

type_name: L罗大佑

type_id: 罗大佑演唱会

type_name: L林志炫

type_id: 林志炫演唱会

type_name: L林忆莲

type_id: 林忆莲演唱会

type_name: L李知恩

type_id: 李知恩演唱会

type_name: L梁静茹

type_id: 梁静茹演唱会

type_name: L冷漠

type_id: 冷漠演唱会

type_name: L李克勤

type_id: 李克勤演唱会

type_name: L林子祥

type_id: 林子祥演唱会

type_name: L黎明

type_id: 黎明演唱会

type_name: L刘若英

type_id: 刘若英演唱会

type_name: M莫文蔚

type_id: 莫文蔚演唱会

type_name: M孟庭苇

type_id: 孟庭苇演唱会

type_name: M麦当娜


code:
var rule={
            title: '中國人',
            host: 'https://chinaqtv.co',
            url:'/vodtype/fyclass.html',
          //https://chinaqtv.co/vodsearch/.html?wd=4
            searchUrl: '/vodsearch/.html?wd=**',
            searchable: 2,//是否启用全局搜索,
            quickSearch: 0,//是否启用快速搜索,
            filterable: 0,//是否启用分类筛选,
            headers:{'User-Agent':'MOBILE_UA'},
            class_parse: '.header&&ul&&li;a&&Text;a&&href;/(\\d+).html',
            play_parse: true,
            lazy: '',
            limit: 6,
          推荐: 'body&&.content;div.drama;*;*;*;*',
          double:true,
          一级: '.content&&div.drama;.title&&Text;.imgcover&&style;p&&Text;a&&href',
          二级: {
                "title": ".title&&Text",
                "content": "pre&&Text",
                "tabs": ".items&&b",//解析源
                "lists": "body&&.items:eq(#id) li"
            },
 }


code:
{
    "规则名": "中国蓝光网",
    "规则作者": "",
    "请求头参数": "手机",
    "网页编码格式": "UTF-8",
    "图片是否需要代理": "0",
    "是否开启获取首页数据": "1",
    "首页推荐链接": " http://www.languangdy.com/",
    "首页列表数组规则": "body&&.post.box",
    "首页片单列表数组规则": ".thumbnail",
    "首页片单是否Jsoup写法": "1",
    "分类起始页码": "1",
    "分类链接": "http://www.languangdy.com/{cateId}/index_{catePg}.html[firstPage=http://www.languangdy.com/{cateId}/]",
    "分类名称": "Bluray蓝光原盘&4K超高清&蓝光1080&WEB-DL高清电影&TVshow&电影合集&其他资源",
    "分类名称替换词": "Bluray&4K&1080P&WEB-DL&other/TVshow&other/Collection&other",
    "筛选数据": {},
    //"筛选数据": "ext",
    //{cateId}
    "筛选子分类名称": "",
    "筛选子分类替换词": "",
    //{class}
    "筛选类型名称": "",
    "筛选类型替换词": "*",
    //{area}
    "筛选地区名称": "",
    "筛选地区替换词": "*",
    //{year}
    "筛选年份名称": "",
    "筛选年份替换词": "*",
    //{lang}
    "筛选语言名称": "",
    "筛选语言替换词": "*",
    //{by}
    "筛选排序名称": "时间&人气&评分",
    "筛选排序替换词": "time&hits&score",
    "分类截取模式": "1",
    "分类列表数组规则": "body&&.post.box",
    "分类片单是否Jsoup写法": "1",
    "分类片单标题": "a&&title",
    "分类片单链接": "a&&href",
    "分类片单图片": "img&&src",
    "分类片单副标题": ".info_category info_ico&&Text",
    "分类片单链接加前缀": "",
    "分类片单链接加后缀": "",
    "搜索请求头参数": "手机",
    "搜索链接": " http://www.languangdy.com/e/search/index.php;post",
    "POST请求数据": "show=title&tempid=1&tbname=article&mid=1&dopost=search&submit=&keyboard={wd}",
    "搜索截取模式": "1",
    "搜索列表数组规则":  "body&&.thumbnail",
    "搜索片单是否Jsoup写法": "1",
    "搜索片单图片":  "img&&src",
    "搜索片单标题":"a&&title!<font color='red'>",
    "搜索片单链接":"a&&href",
    "搜索片单副标题": ".info_category info_ico&&Text",
    "搜索片单链接加前缀": "",
    "搜索片单链接加后缀": "",
    "链接是否直接播放": "0",
    "直接播放链接加前缀": "",
    "直接播放链接加后缀": "",
    "直接播放直链视频请求头": "",
    "详情是否Jsoup写法": "1",
    "类型详情": "body&&.context&&p:contains(类)&&Text!",
    "年代详情": "body&&.context&&p:contains(年)&&Text!",
    "地区详情": "body&&.context&&p:contains(产)&&Text!",
    "演员详情": "body&&.context&&p:contains(演)&&Text!",
    "简介详情": "body&&.context&&p:contains(，)&&Text!",
    "线路列表数组规则": "body&&.dldiv",
    "线路标题": "a&&Text",
    "播放列表数组规则": "body&&.dldiv",
    "选集列表数组规则": "a&&[href^=magnet]",
    "选集标题链接是否Jsoup写法": "1",
    "选集标题": "a&&Text",
    "选集链接": "a&&href",
    "是否反转选集序列": "0",
    "选集链接加前缀": "",
    "选集链接加后缀": "",
    "分析MacPlayer": "0",
    "是否开启手动嗅探": "0",
    "手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos",
    "手动嗅探视频链接过滤词": ".html#=http"
}


code:
var rule = {
	title:'好趣网',
	编码:'GBK',//不填就默认utf-8
	搜索编码:'GBK',//不填则不编码，默认都是按utf-8.可优先于全局编码属性.比如网页源码编码是gbk,这里可以指定utf-8搜索独立编码。多数情况这个属性不填或者填写gbk应对特殊的网站搜索
	host:'http://tv.haoqu99.com',
	url: '/fyclass',
	searchUrl: '/e/sch/index.php?page=fypage&keyboard=**&sear=1',
	searchable:2,//是否启用全局搜索,
	quickSearch:0,//是否启用快速搜索,
	headers:{
		'User-Agent': 'MOBILE_UA'
	},
	timeout:5000,//网站的全局请求超时,默认是3000毫秒
	class_name:'央视&卫视频道&港澳台频道&国外电视台&广东&湖南&江苏&安徽&浙江&北京&辽宁&江西&山东&黑龙江&上海&云南&四川&河南&湖北&福建&重庆&河北&吉林&广西&山西&陕西&宁夏&海南&甘肃&新疆&内蒙古&天津&贵州&青海&西藏',
	class_url:'1&2&4&5&3/guangdong&3/hunan&3/jiangsu&3/anhui&3/zhejiang&3/beijing&3/liaoning&3/jiangxi&3/shandong&3/heilongjiang&3/shanghai&3/yunnan&3/sichuan&3/henan&3/hubei&3/fujian&3/zhongqing&3/hebei&3/jilin&3/guangxi&3/shan-xi&3/shanxi&3/ningxia&3/hainan&3/gansu&3/xinjiang&3/neimenggu&3/tianjin&3/guizhou&3/qinghai&3/xizang',
	play_parse:true,
	// lazy:'js:input=input.replace("tv", "m")',
	lazy:'js:var url=jsp.pdfh(request(input),"body&&script&&Html").split("$")[1];input=url',
	limit:6,
	推荐: '.p-list-sya&&li;.s&&Text;img&&src;;a&&href',
	一级: '.bx-sya&&li;span&&Text;img&&src;;a&&href',
	// 二级: '*',
	二级: {
		"title": "strong.t&&Text;.v-top&&a:eq(1)&&Text",
		"img": ".drop-panel:eq(1)&&img&&src",
		"desc": ";;;;",
		"content": ".drop-panel:eq(1)&&p:eq(2)&&Text",
		"tabs": "js:TABS=['播放源']",
		'lists': 'js:log(TABS);let d=[];pd=jsp.pd;pdfh=jsp.pdfh;pdfa=jsp.pdfa;if(typeof play_url==="undefined"){var play_url=""}function getLists(html){let src=pdfa(html,".tab-list-syb&&li");let list=[];src.forEach(function(it){let title=pdfh(it,".s&&Text");let url="http://m.haoqu99.com/e/extend/tv.php?id="+pd(it,".tab-item&&data-player");list.push({title:title,url:url})});return{list:list,}}var data=getLists(html);var list=data.list;list=list.map(function(item){return(item.title+"$"+item.url)});log("list------------->"+list);LISTS=[list];'
	},
	搜索: 'div.list-box.J-medal&&li;a&&Text;;;a&&href',
}


code:
var rule = {
    title:'有声小说吧',
    编码:'gb18030',
    host:'http://m.ysxs8.vip',
    url:'/downlist/fyclass_fypage.html',
    searchUrl:'/search.asp?page=fypage&searchword=**&searchtype=-1',
    searchable:2,
    quickSearch:0,
    headers:{
        'User-Agent':'MOBILE_UA'
    },
    timeout:5000,
    // homeUrl:'/fenlei/',
    // class_parse: '.pd-class:eq(0) dd;a&&Text;a&&href;.*/(.*?).html',
    class_name:'网络玄幻&恐怖悬疑&传统武侠&都市言情&官场刑侦&历史军事&探险盗墓&职场商战&明朝那些事儿&评书下载&相声戏曲&人物传记&广播剧&百家讲坛&外语读物&有声文学&儿童读物&管理营销',
    class_url:'r52&r17&r12&r13&r14&r15&r45&r81&r36&r3&r7&r16&r18&r32&r35&r41&r4&r6',
    play_parse:true,
    lazy:'',
    limit:6,
    // double:true,
    推荐:'.list-ul .list-li;.list-name&&Text;*;.module-slide-author&&Text;*',
    一级:'.book-ol&&li;h4&&Text;img&&data-original;.book-meta&&Text;a&&href',
    二级:{
    	// title:'h2&&Text;.book-cell .book-rand-a:eq(2)&&Text',
        title:'h1&&Text;.book-cell .book-rand-a:eq(0)&&a&&Text',
    	img:'.book img&&src',
    	// desc:';;;;.book-des p&&Text',
        desc:';;;.book-rand-a:eq(2)&&Text;.book-des p&&Text',
    	content:'.book-des--p&&Text',
	    tabs:'.playlist-top&&h2',
    	// lists:'js:pd=jsp.pd;let url=pd(html,".bookbutton&&a&&href");log(url);html=request(url);let v=pd(html,".booksite&&script&&Html");var document={};var VideoListJson;VideoListJson=eval(v.split("VideoListJson=")[1].split(",urlinfo")[0]);log(typeof VideoListJson);let list1=VideoListJson[0][1];LISTS=[list1];log(LISTS);',
   		// 有声小说有防盗链,我服了(上面的列表数据正常拿到了,没法播放)
   		//  lists:'#playlist:eq(#id)&&ul&&li',
    	lists:'#playlist ul li',
    },
    搜索:'*',
}


code:
/*
 * @Author: bestpvp bestpvp@sina.com
 * @Date: 2023-10-05 16:37:17
 * @LastEditors: bestpvp bestpvp@sina.com
 * @LastEditTime: 2023-10-06 17:21:09
 * @FilePath: /lintech/docs/static/tvbox/js/盒锦_荐片.js
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
var rule = {
    title: '荐片',
    host: 'http://api2.rinhome.com',
    // homeUrl:'https://yjpapipxblwdohpakljwg.hxhzs.com/api/tag/hand?code=unknown601193cf375db73d&channel=wandoujia',//网站的首页链接,用于分类获取和推荐获取
    homeUrl: '/api/tag/hand?code=unknown601193cf375db73d&channel=wandoujia',//网站的首页链接,用于分类获取和推荐获取
    // url:'/api/crumb/list?area=0&category_id=fyclass&page=fypage&type=0&limit=24&fyfilter',
    url: '/api/crumb/list?area=0&page=fypage&type=0&limit=24&fyfilter',
    class_name: '全部&电影&电视剧&动漫&综艺',     // 筛选 /api/term/ad_fenlei?limit=10&page=1
    class_url: '0&1&2&3&4',
    detailUrl: '/api/node/detail?channel=wandoujia&token=&id=fyid',//二级详情拼接链接(json格式用)
    searchUrl: '/api/video/search?key=**&page=fypage',
    searchable: 2,
    quickSearch: 0,
    filterable: 1,
    filter: {
        "0": [{ "key": "year", "name": "年代", "value": [{ "n": "全部", "v": "0" }, { "n": "2023", "v": "153" }, { "n": "2022", "v": "101" }, { "n": "2021", "v": "118" }, { "n": "2020", "v": "16" }, { "n": "2019", "v": "7" }, { "n": "2018", "v": "2" }, { "n": "2017", "v": "3" }, { "n": "2016", "v": "22" }] }, { "key": "sort", "name": "排序", "value": [{ "n": "热门", "v": "hot" }, { "n": "评分", "v": "rating" }, { "n": "更新", "v": "update" }] }],
        "1": [{ "key": "cateId", "name": "分类", "value": [{ "n": "全部", "v": "1" }, { "n": "首推", "v": "5" }, { "n": "动作", "v": "6" }, { "n": "喜剧", "v": "7" }, { "n": "战争", "v": "8" }, { "n": "恐怖", "v": "9" }, { "n": "剧情", "v": "10" }, { "n": "爱情", "v": "11" }, { "n": "科幻", "v": "12" }, { "n": "动画", "v": "13" }] }, { "key": "year", "name": "年代", "value": [{ "n": "全部", "v": "0" }, { "n": "2023", "v": "153" }, { "n": "2022", "v": "101" }, { "n": "2021", "v": "118" }, { "n": "2020", "v": "16" }, { "n": "2019", "v": "7" }, { "n": "2018", "v": "2" }, { "n": "2017", "v": "3" }, { "n": "2016", "v": "22" }] }, { "key": "sort", "name": "排序", "value": [{ "n": "热门", "v": "hot" }, { "n": "评分", "v": "rating" }, { "n": "更新", "v": "update" }] }],
        "2": [{ "key": "cateId", "name": "分类", "value": [{ "n": "全部", "v": "2" }, { "n": "首推", "v": "14" }, { "n": "国产", "v": "15" }, { "n": "港台", "v": "16" }, { "n": "日韩", "v": "17" }, { "n": "海外", "v": "18" }] }, { "key": "year", "name": "年代", "value": [{ "n": "全部", "v": "0" }, { "n": "2023", "v": "153" }, { "n": "2022", "v": "101" }, { "n": "2021", "v": "118" }, { "n": "2020", "v": "16" }, { "n": "2019", "v": "7" }, { "n": "2018", "v": "2" }, { "n": "2017", "v": "3" }, { "n": "2016", "v": "22" }] }, { "key": "sort", "name": "排序", "value": [{ "n": "热门", "v": "hot" }, { "n": "评分", "v": "rating" }, { "n": "更新", "v": "update" }] }],
        "3": [{ "key": "cateId", "name": "分类", "value": [{ "n": "全部", "v": "3" }, { "n": "首推", "v": "19" }, { "n": "海外", "v": "20" }, { "n": "日本", "v": "21" }, { "n": "国产", "v": "22" }] }, { "key": "year", "name": "年代", "value": [{ "n": "全部", "v": "0" }, { "n": "2023", "v": "153" }, { "n": "2022", "v": "101" }, { "n": "2021", "v": "118" }, { "n": "2020", "v": "16" }, { "n": "2019", "v": "7" }, { "n": "2018", "v": "2" }, { "n": "2017", "v": "3" }, { "n": "2016", "v": "22" }] }, { "key": "sort", "name": "排序", "value": [{ "n": "热门", "v": "hot" }, { "n": "评分", "v": "rating" }, { "n": "更新", "v": "update" }] }],
        "4": [{ "key": "cateId", "name": "分类", "value": [{ "n": "全部", "v": "4" }, { "n": "首推", "v": "23" }, { "n": "国产", "v": "24" }, { "n": "海外", "v": "25" }, { "n": "港台", "v": "26" }] }, { "key": "year", "name": "年代", "value": [{ "n": "全部", "v": "0" }, { "n": "2023", "v": "153" }, { "n": "2022", "v": "101" }, { "n": "2021", "v": "118" }, { "n": "2020", "v": "16" }, { "n": "2019", "v": "7" }, { "n": "2018", "v": "2" }, { "n": "2017", "v": "3" }, { "n": "2016", "v": "22" }] }, { "key": "sort", "name": "排序", "value": [{ "n": "热门", "v": "hot" }, { "n": "评分", "v": "rating" }, { "n": "更新", "v": "update" }] }]
    },
    // filter_url:'sort={{fl.sort or "hot"}}&year={{fl.year or "0"}}',
    filter_url: 'sort={{fl.sort or "update"}}&year={{fl.year or "0"}}&category_id={{fl.cateId}}',
    filter_def: {
        0: { cateId: '0' },
        1: { cateId: '1' },
        2: { cateId: '2' },
        3: { cateId: '3' },
        4: { cateId: '4' }
    },
    headers: {
        'User-Agent': 'jianpian-android/350',
        'JPAUTH': 'y261ow7kF2dtzlxh1GS9EB8nbTxNmaK/QQIAjctlKiEv'
    },
    timeout: 5000,
    limit: 8,
    play_parse: true,
    play_json: [{
        re: '*',
        json: {
            parse: 0,
            jx: 0
        }
    }],
    lazy: '',
    // double:true,
    图片来源: '@Referer=www.jianpianapp.com@User-Agent=jianpian-version353',
    // 推荐:'json:data;room;*;cover;*;*',
    推荐: 'json:.video;*;*;*;*',
    一级: 'json:data;title;path;playlist.title;id',
    二级: {
        // title:'data.title',
        title: 'data.title;data.types[0].name',
        // desc:';data.description;data.id',
        desc: 'data.score;data.year.title;data.area.title;data.actors[0].name;data.directors[0].name',
        img: 'data.thumbnail',
        // content:'data.thumbnail',
        content: 'data.description',
        is_json: 1,
        tabs: `js:
            TABS = [];
            if (html.data.have_ftp_ur == 1) {
                TABS.push("边下边播超清版")
            }
            if (html.data.have_m3u8_ur == 1) {
                TABS.push("在线点播普清版")
            }
        `,
        lists: `js:
            log(TABS);
            LISTS = [];
            TABS.forEach(function(tab) {
                if (/边下边播/.test(tab)) {
                    let ftp = html.data.new_ftp_list;
                    let d = ftp.map(function(it) {
                        return it.title + "$" + (/m3u8/.test(it.url) ? play_url + it.url : "tvbox-xg:" + it.url)
                    });
                    LISTS.push(d)
                } else if (/在线点播/.test(tab)) {
                    let m3u = html.data.new_m3u8_list;
                    let d = m3u.map(function(it) {
                        return it.title + "$" + (/m3u8/.test(it.url) ? play_url + it.url : "tvbox-xg:" + it.url)
                    });
                    LISTS.push(d)
                }
            });
        `,
    },
    搜索: 'json:data;*;thumbnail;mask;*',
}


数组: module-item-pic&&module-item-cover

副标题: module-item-text*>&&<


code:
// 搜寻验证
var rule = {
    title:'短视频',
    host:'http://www.sharenice.net',
    url:'/fyclass?page=fypage',
    //searchUrl:'/video/search?search_key=**',
    searchable:0,
    quickSearch:0,
    headers:{
        'User-Agent':'PC_UA'
    },
    timeout:5000,
    // class_name:'抖音&快手&微视&火山&场库&体育&美拍&秒拍&全民&梨&好兔&美女&正能量&搞笑&社会&游戏&娱乐&旅游&萌系&生活&音乐&美食&明星&动漫&影视&时尚',
    class_name:'抖音&快手&微视&火山&场库&美拍&秒拍&全民&澎湃&好兔&开眼&美女&搞笑&社会&影视&音乐&娱乐&正能量&生活&动漫&体育&美食&萌系&旅游&游戏&明星&时尚',
    // class_url:'douyin&kuaishou&weishi&huoshan&changku&tags/t-5L2T6IKy.html&meipai&miaopai&quanmin&lishipin&haotu&tags/t-576O5aWz.html&tags/t-5q2j6IO96YeP.html&tags/t-5pCe56yR.html&tags/t-56S+5Lya.html&tags/t-5ri45oiP.html&tags/t-5aix5LmQ.html&tags/t-5peF5ri4.html&tags/t-6JCM57O7.html&tags/t-55Sf5rS7.html&tags/t-6Z+z5LmQ.html&tags/t-576O6aOf.html&tags/t-5piO5pif.html&tags/t-5Yqo5ryr.html&tags/t-5b2x6KeG.html&tags/t-5pe25bCa.html',
    class_url:'douyin&kuaishou&weishi&huoshan&changku&meipai&miaopai&quanmin&lishipin&haotu&kaiyan&t-576O5aWz&t-5pCe56yR&t-56S+5Lya&t-5b2x6KeG&t-6Z+z5LmQ&t-5aix5LmQ&t-5q2j6IO96YeP&t-55Sf5rS7&t-5Yqo5ryr&t-5L2T6IKy&t-576O6aOf&t-6JCM57O7&t-5peF5ri4&t-5ri45oiP&t-5piO5pif&t-5pe25bCa',
    play_parse:true,
    lazy:'js:/kuaishou/.test(input)?input=jsp.pdfh(request("http://m.sharenice.net/mobile"+input.split("net")[1]),".video-play-box&&video&&src"):input=jsp.pdfh(request("http://m.sharenice.net/mobile"+input.split("net")[1]),".video-play-box&&video&&src")+"#.mp4"',
    limit:6,
    double:false,
    推荐:'*',
    一级:'.item-box&&ul&&li;a&&title;img&&data-original;;a&&href',
    二级:'*',
}


code:
local S
if minetest.get_modpath("intllib") then
    S = intllib.Getter()
else
    S = function(s,a,...)a={a,...}return s:gsub("@(%d+)",function(n)return a[tonumber(n)]end)end
end

advtrains.register_wagon("engine_railbus", {
	mesh="advtrains_railbus.b3d",
	textures = {"advtrains_railbus.png"},
	drives_on={default=true},
	max_speed=20,
	seats = {
		{
			name=S("Driver stand"),
			attach_offset={x=0, y=8, z=13},
			view_offset={x=0, y=0, z=0},
			driving_ctrl_access=true,
			group="dstand",
		},
		{
			name="1",
			attach_offset={x=-4, y=8, z=0},
			view_offset={x=0, y=0, z=0},
			group="pass",
		},
		{
			name="2",
			attach_offset={x=4, y=8, z=0},
			view_offset={x=0, y=0, z=0},
			group="pass",
		},
		{
			name="3",
			attach_offset={x=-4, y=8, z=-8},
			view_offset={x=0, y=0, z=0},
			group="pass",
		},
		{
			name="4",
			attach_offset={x=4, y=8, z=-8},
			view_offset={x=0, y=0, z=0},
			group="pass",
		},
	},
	seat_groups = {
		dstand={
			name = "Driver Stand",
			access_to = {"pass"},
			require_doors_open=true,
		},
		pass={
			name = "Passenger area",
			access_to = {"dstand"},
			require_doors_open=true,
		},
	},
	assign_to_seat_group = {"dstand", "pass"},
	door_entry={-1},
	visual_size = {x=1, y=1},
	wagon_span=2.5,
	is_locomotive=true,
	collisionbox = {-1.0,-0.5,-1.0, 1.0,2.5,1.0},
	drops={"advtrains:engine_railbus"},
}, S("railbus"), "advtrains_railbus_inv.png")

license: unknown


code:
##### Paths of the script and other files
PROGDIR="/usr/local/ddos"
PROG="/usr/local/ddos/ddos.sh"
IGNORE_IP_LIST="/usr/local/ddos/ignore.ip.list"
CRON="/etc/cron.d/ddos.cron"
APF="/etc/apf/apf"
IPT="/sbin/iptables"

##### frequency in minutes for running the script
##### Caution: Every time this setting is changed, run the script with --cron
#####          option so that the new frequency takes effect
FREQ=1

##### How many connections define a bad IP? Indicate that below.
NO_OF_CONNECTIONS=150

##### APF_BAN=0 (Make sure your APF version is atleast 0.96)
##### APF_BAN=1 (Uses iptables for banning ips instead of APF)
APF_BAN=1

##### KILL=0 (Bad IPs are'nt banned, good for interactive execution of script)
##### KILL=1 (Recommended setting)
KILL=1

##### An email is sent to the following address when an IP is banned.
##### Blank would suppress sending of mails
EMAIL_TO="root"

##### Number of seconds the banned ip should remain in blacklist.
BAN_PERIOD=600